这个用于解析电子邮件的RegEx如何在PHP中运行?

时间:2010-04-19 21:15:18

标签: php regex email

好的,我有以下PHP代码来提取以下两种形式的电子邮件地址:

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

这是PHP代码:

// 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 "</pre><hr>";

// The second example
$sender = "user@domain.com";

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

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

我的问题是...... $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 个答案:

答案 0 :(得分:3)

这对您的preg问题没有帮助,但它会简化您的代码。由于这些是唯一的2个选项,所以不要使用正则表达式

echo end( explode( '<', rtrim( $sender, '>' ) ) );

答案 1 :(得分:0)

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的数组,该数组将填充所有匹配的子部分。

修改 - 请注意您使用的是PREG_OFFSET_CAPTURE标记,该标记会改变$matches填充方式的行为,因此您的结果与我的示例不符。该手册解释了此标志如何改变捕获。在这种情况下,您将获得每个表达式的多维数组,而不是一组匹配的子表达式,其中包含在字符串中找到的位置。

答案 2 :(得分:0)

以下内容直接从http://us.php.net/preg_match

的帮助文档中复制
  

如果提供了匹配,那么它将填充搜索结果。 $ matches [0]将包含与完整模式匹配的文本,$ matches [1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。