Мне нужно прочитать поля из этого 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
Процесс, которым я следую, следующий:
Теперь я хочу прочитать указанные данные и преобразовать их в массив следующим образом:
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)
но это имеет некоторые проблемы:
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);
если вам нужно больше полей, просто добавьте их в регулярное выражение.