我有一个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);