Preg_match Справка.Не удается прочитать строку из электронной почты. - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть скрипт, который читает электронную почту, извлекает информацию из электронной почты и сохраняет ее в моей базе данных sql. Тем не менее, он не содержит никакой информации, касающейся телефонных номеров.

Это мой код для определения номера телефона:

if (preg_match('|^<b>Phone(.*)>\s*(\S*)<?|U', $lines[$i], $matches)) {
    $phone = trim($matches[2]);
}

Пример электронной почты будет выглядеть так:

Name: Joe Schmoe

E-mail Address: joeschmoe@joeschmoe.com

Phone: 555-555-5555

Вот исходный пример того, что электронная почта предоставляет:

    <b>Phone:</b> 555-555-5555</font><br> –

Кажется, переменная $phone заканчивается тем, что она пуста или равна нулю, поскольку она не вставляется в базу данных, но вся моя другая информация ..

Есть предложения по этому вопросу?

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Вот очищенное регулярное выражение, которое должно помочь вам. Он позволяет необязательно разделять последовательности цифр пробелами или дефисами:

$re = '% # Rev:20111101
    # Match phone number after "phone:</br>".
    phone:      # Literal text: "phone:".
    \s*         # Optional (zero or more) whitespace.
    </br>       # Literal text: "</br>".
    \s*         # Optional whitespace.
    (           # Capture group $1:
      [0-9]+    # {normal+} One or more digits.
      (?:       # Group for optional digit separators.
        [ -]    # {special} Digit separator.
        [0-9]+  # {normal+} More one or more digits.
      )*        # End {(special normal+)*} construct.
    )           # End $1: Phone number.
    \s*         # Optional whitespace.
    <           # Ensure number followed by literal "<".
    %ix';       // Use 'x'-free-spacing and 'i'-case-insensitive mode.
if (preg_match($re, $lines[$i], $matches)) {
    $phone = $matches[1];
}

Не используйте модификатор U ungreedy!

Использование модификатора U не является лучшей практикой - его всегда следует избегать. Если вам нужно сделать отдельный квантификатор ленивым, просто добавьте модификатор ? к определенному квантификатору. Обратите внимание, что использование модификатора режима U никогда не требуется и не оправдано - все, что он делает, - это вводит читателя в заблуждение.

Редактировать 2011-11-01 15:14 MDT Регулярное выражение "сломалось", переписав его в свободном интервале и добавив лоты-комментарии.

0 голосов
/ 01 ноября 2011

Я бы попробовал что-то более надежное без использования html-тегов

| \ BPhone: \ s + (\ S *) |

0 голосов
/ 01 ноября 2011

Ваш первый (.*) совпадает в жадном режиме - вы, вероятно, обнаружите, что ВСЕ текст в строке, начиная с Phone и далее до последнего > в строке, были отброшены этой группой захвата и находится в $matches[1].

Указывает ли <b> в шаблоне, что вы работаете над строкой HTML? Вы не должны использовать регулярные выражения в HTML, так как они могут взорвать вас. Вместо этого используйте DOM , чтобы найти номер телефонного узла, а затем извлечь текстовое содержимое узла. Затем вы можете использовать простое выражение подстроки для разделения текста телефонного номера на Phone: и 555-555-5555.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...