2011-07-16 47 views
2

为什么这个例子中两个正则表达式对邮件的评估方式不同?单词边界和字符串开始和字符串锚点结束(正则表达式)有什么区别?

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

<?php 

    $email = 'ΘΘΘ[email protected]'; 
    $regex = '#\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b#i'; 
    $regex2 = '#^[A-Z0-9._%+-][email protected][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

可能希望在你的问题中记下你不期望与之匹配的内容,因为Theta不在你的角色类中用于有效的电子邮件。 –

回答

3

问题是与你的奇怪字符Θ(U0398希腊大写字母西塔)。 PHP并不认为它们是单词的一部分,所以在ΘΘΘ[email protected]之间有一个单词边界。

第一个正则表达式匹配,因为字符串的其余部分是可以的。

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

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

+3

展开:使用utf-8修饰符('/ u')让PHP知道'Θm'不是一个字边界:'$ regex ='#\ b [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] + \ [AZ] {2,4} \ b#IU';' – Wrikken

相关问题