Regex使用javascript,但不使用PHP


Regex works in javascript but not in PHP

我有一个regexp来检查在Javascript中工作的电子邮件地址:

var re = /^([0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-'w]*[0-9a-zA-Z]'.)+[a-zA-Z]{2,9})$/; 
"any.address@gmail.com".search(re); // returns 0

但是当我在PHP中使用preg_match()时,使用相同的regexp和电子邮件是不起作用的!

$re = "/^([0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-'w]*[0-9a-zA-Z]'.)+[a-zA-Z]{2,9})$/";
echo preg_match($re,"any.address@gmail.com");
// echoes 0 - not 1!!

编辑

好的,所以我必须补充更多的细节。

完整的代码在这里:

    $re = '/^([0-9a-zA-Z]([-.'w'+'%'#'!'$'''*'/'='?'^'`'{'|'}'~]*[0-9a-zA-Z])*@([0-9a-zA-Z][-'w]*[0-9a-zA-Z]'.)+[a-zA-Z]{2,9})$/';
    if(is_array($recipients)){
        for($i=0;$i<count($recipients);$i++){
            echo preg_match($re,$recipients[$i]) . " - " . $recipients[$i] . "<br />";
        }
    }

当我只执行preg_match()(在for循环之外)时,它将正确匹配模式。但如果它在这个循环中,那么它就不会验证!

您忘记了在双引号字符串中使用反斜杠在PHP中具有特殊意义。

你甚至echo $re;只是为了确认模式是你所期望的吗?我建议切换到模式的单引号字符串,或者确保转义每个'

$re = "/^([0-9a-zA-Z]([-.''w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-''w]*[0-9a-zA-Z]''.)+[a-zA-Z]{2,9})$/"
$re = '/^([0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-'w]*[0-9a-zA-Z]'.)+[a-zA-Z]{2,9})$/';

顺便说一句,正如其他人所提到的,它确实返回1。

我想我会提到转义,因为当使用双引号时,它可能或将成为模式的问题(即使在本例中不是)

通常建议使用PHPs内置正则表达式进行电子邮件验证,该正则表达式具有更广泛的语法变体:

filter_var($email, FILTER_VALIDATE_EMAIL)

参见filter_var
但是顺便说一句,FILTER_VALIDATE_EMAIL也是用正则表达式实现的。看见https://github.com/php/php-src/blob/master/ext/filter/logical_filters.c#L522为此。

不过,这与您最初遇到的空白问题无关。

您需要使用单引号,以便忽略转义符。

$re = '/^([0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-'w]*[0-9a-zA-Z]'.)+[a-zA-Z]{2,9})$/';
preg_match_all($re, 'any.address@gmail.com', $arr, PREG_PATTERN_ORDER);
var_dump($arr);