2012-01-13 100 views
2

我有一个正则表达式来检查,在JavaScript的作品电子邮件地址:正则表达式工作在JavaScript,但不是在PHP

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})$/; 
"[email protected]".search(re); // returns 0 

但是,当我在使用PHP的preg_match(),使用相同的正则表达式,并通过电子邮件发送它doesn”工作!

$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,"[email protected]"); 
// 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

没有'foo + bar @ example.com'? (更不用说'%','_' *等*)我是一只中度伤心的熊猫。 – Piskvor 2012-01-13 15:42:01

+2

那很奇怪。 [IDEOne](http://ideone.com/JHuqs)似乎不同意。 – 2012-01-13 15:42:06

+2

对我来说工作很好... – prodigitalson 2012-01-13 15:46:35

回答

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

不过,与您原来的空白问题无关。

+0

我接受这个答案,因为它是验证电子邮件的正确方式。这与'trim()'解决方案一起解决了我的答案。 – Martin 2013-03-01 20:47:38

4

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

你甚至还有echo $re;只是为了证实你的pat牙是你期望它是什么?我建议切换到单引号字符串的模式,或确保你每\逃生。

$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})$/'; 

顺便说一句,正如别人提到的那样,它does return 1

我以为我会提出逃避,因为它(即使不在这种情况下)可以或​​将会在双引号引起模式的问题。

+1

这只是部分正确。对于无效的转义序列,PHP返回输入。 'echo“\ w”'实际输出“\ w”。 – 2012-01-13 15:44:28

+0

@LinusKleen:同意,我在答复的底部添加了一些更明确的信息,但感谢您的反馈。 – 2012-01-13 15:45:28

+0

我重复它,这是我的预期。我切换到单引号,仍然没有去。 – Martin 2012-01-13 15:47:33

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, '[email protected]', $arr, PREG_PATTERN_ORDER); 
var_dump($arr); 
相关问题