Электронная почта читается на PHP

Мне нужно прочитать поля из этого 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 

Процесс, которым я следую, следующий:

  1. Подключение через IMAP
  2. получить тело nessage

Теперь я хочу прочитать указанные данные и преобразовать их в массив следующим образом:

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

Я попробовал preg_match('/(?P<Pickup Address>\w+): (?P<Delivery Address>\d+)/', $body, $matches)

но это имеет некоторые проблемы:

  1. Он не принимает место в «Пикап-адрес»
  2. он предоставляет массив в Array ( [0] => Address: 34 [PickupAddress] => Address [1] => Address [DeliveryAddress] => 34 [2] => 34 ) .

В основном мне нужно сохранить эти поля в базе данных, и я не могу использовать приложение здесь. Дайте мне знать, есть ли у вас какое-либо другое решение или какой-либо способ заставить его работать

Что-то вроде этого ?

 $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); } 

Вывод:

 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 ) 

Кажется, вы выбрали решение, и у вас возникли трудности с его решением. Да, вы могли бы использовать регулярные выражения, но вам нужно будет определить проблему намного лучше, чем у вас уже есть. Что делать, если строка содержит более одного:? Как насчет пустых строк? Что делать, если элемент данных охватывает более одной строки (что может быть сделано в зависимости от того, как кодируется электронная почта)?

Хотя вы можете использовать парсер YAML , это, вероятно, слишком велико для простого макета:

 $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; } 

Вы можете использовать такой код:

 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); 

если вам нужно больше полей, просто добавьте их в регулярное выражение.