Correo electrónico leído en PHP

Necesito leer los campos de este email

 MOVE INFORMATION Pickup Address: 34 Marigold Ln, Marlboro, NJ 07746 Delivery Address: 180 Prospect Park W, Apt 5, Brooklyn, NY 11215 Primary service dates: Pack Date: N/A Move Date: 6/6/2013 Other service dates: Pack Date 2: N/A Move Date2: N/A Other Date: N/A 

El proceso que estoy siguiendo es:

  1. Conectar a través de IMAP
  2. obtener el cuerpo de nessage

Ahora quiero leer los datos especificados y necesito convertirlos en una matriz como:

 array( ' Pickup Address'=>'34 Marigold Ln, Marlboro, NJ 07746', 'Delivery Address'=>'180 Prospect Park W, Apt 5, Brooklyn, NY 11215'...) 

He intentado preg_match('/(?P\w+): (?P\d+)/', $body, $matches)

pero eso está teniendo un problema:

  1. No está aceptando espacio en ‘Dirección de recogida’
  2. está proporcionando una matriz en Array ( [0] => Address: 34 [PickupAddress] => Address [1] => Address [DeliveryAddress] => 34 [2] => 34 ) de Array ( [0] => Address: 34 [PickupAddress] => Address [1] => Address [DeliveryAddress] => 34 [2] => 34 ) .

Básicamente, necesito guardar estos campos en la base de datos y no puedo usar archivos adjuntos aquí. Avíseme si tiene alguna otra solución o cualquier forma de hacerlo funcionar

Algo como esto ?

 $string = 'MOVE INFORMATION Pickup Address: 34 Marigold Ln, Marlboro, NJ 07746 Delivery Address: 180 Prospect Park W, Apt 5, Brooklyn, NY 11215 Primary service dates: Pack Date: N/A Move Date: 6/6/2013 Other service dates: Pack Date 2: N/A Move Date2: N/A Other Date: N/A'; preg_match_all('#(.*?):(.*)#m', $string, $m); if(isset($m[1], $m[2])){ $array = array_combine($m[1], $m[2]); print_r($array); } 

Salida:

 Array ( [Pickup Address] => 34 Marigold Ln, Marlboro, NJ 07746 [Delivery Address] => 180 Prospect Park W, Apt 5, Brooklyn, NY 11215 [Primary service dates] => [Pack Date] => N/A [Move Date] => 6/6/2013 [Other service dates] => [Pack Date 2] => N/A [Move Date2] => N/A [Other Date] => N/A ) 

Parece que has elegido una solución y luego tienes dificultades para que se adapte al problema. Sí, podrías usar expresiones regulares, pero vas a tener que definir el problema mucho mejor de lo que ya tienes. ¿Qué pasa si una línea contiene más de un ‘:’? ¿Qué pasa con las líneas en blanco? ¿Qué pasa si un elemento de datos abarca más de una línea (lo que podría hacer dependiendo de cómo se codifica el correo electrónico)?

Si bien puedes usar un analizador YAML , probablemente sea excesivo para un diseño simple:

 $data=array(); while ($line=fgets($file_handle)) { $key=trim(substr($line, 0, strpos($line, ':'))); $value=trim(substr($line, strpos($line, ':')+1)); if ($key && $value) $data[$key]=$value; } 

Puedes usar un código como este:

 preg_match_all("/(Pickup Address|Delivery Address): *(.*)/", $email, $match); $result = array(); foreach($match[1] as $i => $key) { $result[$key] = $match[2][$i]; } print_r($result); 

si quieres más campos solo agrégalos a la expresión regular.