我有一个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循环之外)时,它将正确匹配模式。但如果它在这个循环中,那么它将无法验证!
答案 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。
与您最初的空白问题无关。