Word Boundaries和String of String和End of String Anchors(正则表达式)之间有什么区别?

时间:2011-07-16 08:41:30

标签: php regex

为什么在此示例中,两个正则表达式对电子邮件的评估方式不同?

http://codepad.viper-7.com/SEgMzZ

    <?php

    $email = 'ΘΘΘme@gmail.com';
    $regex = '#\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b#i';
    $regex2 = '#^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$#i';


    if (preg_match($regex, $email)) {
        echo "A match was found.";
    } else {
        echo "A match was not found.";
    }


    if (preg_match($regex2, $email)) {
        echo "A match was found.";
    } else {
        echo "A match was not found.";
    }
    ?>

编辑:我希望这两个都不匹配

1 个答案:

答案 0 :(得分:3)

问题出在你的奇怪Θ字符(U0398希腊大写字母Theta)上。 PHP并未将它们视为单词的一部分,因此ΘΘΘme@...之间存在单词边界。

第一个正则表达式匹配,因为字符串的其余部分没问题。

第二个不匹配,因为那些Θ不在第一个字符类中,所以你的字符串与它不匹配。

正如Wrikken指出的那样,您可以在正则表达式中使用/u (PCRE8)修饰符来使PHP将字符串视为UTF-8。在这种情况下,Theta字母不会引入单词边界,并且两个表达式都不匹配。