Как работает этот RegEx для разбора писем в PHP? - PullRequest
0 голосов
/ 20 апреля 2010

Хорошо, у меня есть следующий PHP-код для извлечения адреса электронной почты следующих двух форм:

Random Stranger <email@domain.com>
email@domain.com

Вот код PHP:

<code>// The first example
$sender = "Random Stranger <email@domain.com>";

$pattern = '/([\w_-]*@[\w-\.]*)|.*<([\w_-]*@[\w-\.]*)>/';

preg_match($pattern,$sender,$matches,PREG_OFFSET_CAPTURE);

echo "<pre>";
print_r($matches);
echo "

"; // Второй пример $ sender = "user@domain.com"; preg_match ($ шаблон, $ отправителя, $ соответствует, PREG_OFFSET_CAPTURE); echo "
";
print_r($matches);
echo "
";

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

Обновление:

Вот вывод:

Array
(
    [0] => Array
        (
            [0] => Random Stranger 
            [1] => 0
        )

    [1] => Array
        (
            [0] => 
            [1] => -1
        )

    [2] => Array
        (
            [0] => user@domain.com
            [1] => 5
        )

)
Array
(
    [0] => Array
        (
            [0] => user@domain.com
            [1] => 0
        )

    [1] => Array
        (
            [0] => user@domain.com
            [1] => 0
        )

)

Ответы [ 3 ]

3 голосов
/ 20 апреля 2010

Это не поможет вам с вопросом preg, но упростит ваш код. Так как это только 2 опции, не используйте регулярные выражения

echo end( explode( '<', rtrim( $sender, '>' ) ) );
0 голосов
/ 20 апреля 2010

Следующая информация копируется непосредственно из справочного документа по адресу http://us.php.net/preg_match

Если совпадения предоставлены, то они заполняются результатами поиска.$ match [0] будет содержать текст, который соответствует полному шаблону, $ match [1] будет иметь текст, который соответствует первому захваченному заключенному в скобки подшаблону и так далее.

0 голосов
/ 20 апреля 2010

Страница справочника preg_match () объясняет, как работает $matches. Это необязательный параметр, который заполняется результатами любого вложенного выражения в скобках из вашего регулярного выражения в порядке их совпадения. $matches[0] - это всегда полное совпадение выражения, за которым следуют подвыражения.

Так, например, этот шаблон содержит два подвыражения, ([\w_-]*@[\w-\.]*) и ([\w_-]*@[\w-\.]*). Части, соответствующие этим двум выражениям, будут помещены в $matches[1] и $matches[2] соответственно. Я думаю, что после быстрого взгляда, что для адреса электронной почты Random Stranger <email@domain.com>, у вас будет что-то вроде этого в $matches:

Array( 
    0 => "Random Stranger <email@domain.com>",
    1 => "Random Stranger",
    2 => "email@domain.com"
)

Думайте об этом как о передаче массива с именем $matches по ссылке, который заполняется всеми подобранными частями.

Edit - обратите внимание, что вы используете флаг PREG_OFFSET_CAPTURE, который изменяет поведение заполнения $matches, поэтому ваш результат не будет соответствовать моему примеру. Руководство объясняет, как этот флаг также влияет на захват. В этом случае вместо набора совпадающих подвыражений вы получаете многомерный массив каждого выражения с той позицией, в которой он был найден в строке.

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