正则表达式适用于javascript但不适用于PHP

时间:2012-01-13 15:39:31

标签: php javascript regex

我有一个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()时,使用相同的正则表达式和电子邮件它不起作用!

$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循环之外)时,它将正确匹配模式。但如果它在这个循环中,那么它将无法验证!

3 个答案:

答案 0 :(得分:4)

在双引号字符串中使用时,您忘记了反斜杠在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})$/';
正如其他人所提到的那样,BTW does return 1

我认为我会提起逃避,因为它(在这个例子中不是)在双引号时可能或将会是模式的问题。

答案 1 :(得分:0)

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

$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);

答案 2 :(得分:0)

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

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

与您最初的空白问题无关。