Не удалось получить желаемые результаты с помощью preg_match_all

Я пытаюсь запрограммировать php-скрипт электронной почты, который будет принимать отчет об обновлении входящего трафика по электронной почте и извлекать из него соответствующую информацию для хранения в базе данных.

Электронное письмо обычно начинается с введения, а важная информация отображается в следующем формате.

Highway : Some Highway 
Time : 08-Oct-2010 08:10 AM 
Condition : Smooth (or slow moving etc)

Я пробовал с этим кодом

preg_match_all('/(?P<\name>\w+) : (?P<\data>\w+)/i', $subject, $result);

Обратите внимание, что ‹ / на самом деле просто ‹, но почему-то они здесь не отображаются.

И совпадения только:

Highway : Some
Datetime : 08
Condition : Smooth

Может ли кто-нибудь сказать мне, чего не хватает во втором выражении регулярного выражения? Почему он не включает всю строку слов после «:»?


person blacklotus    schedule 08.10.2010    source источник


Ответы (1)


Вы снимаете \w+. Соответствует только символам слова, не включает пробелы и круглые скобки.

Пытаться

preg_match_all('/(?P<name>\w+)\s*:\s*(?P<data>.*)/i', $subject, $result);

попробуйте использовать .*? Это сопоставит все до символа новой строки

person Galen    schedule 08.10.2010
comment
Большое спасибо Гален! Могу я узнать, что именно делает *? - person blacklotus; 08.10.2010
comment
@blacklotus: звезда Клини (*) в регулярном выражении означает ноль или более повторений чего-либо. В этом ответе \s* означает ноль или более пробельных символов. Нулевая часть важна, так как что-то вроде ab*a будет соответствовать aba и abbbbba, но также aa. - person eldarerathis; 08.10.2010