PHP电子邮件正则表达式仍然允许2点直接相继

时间:2009-08-11 01:49:43

标签: php regex email

在PHP中,我使用此正则表达式来检查邮件:

$rexMail = "/^[a-z0-9\._]+@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";

在大多数情况下,这就足够了。但是,此邮件地址对正则表达式有效:

  

test..test @ test.com

这不应该是可能的。虽然在@符号之前应该允许多个点,但是不可能在彼此之后有多个点。

我不是 对正则表达式很好,我不知道如何解决这个问题。

另外,我对@符号后面的点数不太确定,因为有这样的邮件地址为.co.uk,或者说最差。

5 个答案:

答案 0 :(得分:3)

首先,test..test @ example.com是一个完全有效的电子邮件地址。没有任何内容表明电子邮件地址在@符号之前不能有多个连续的句点字符。实际上,在@符号之前可以有任何东西,包括一些你不允许的字符(例如+)。所以,你现在就会拒绝各种完全有效的地址。

请参阅http://www.regular-expressions.info/email.html,了解一个直截了当的表达方法,以及一些解释为什么电子邮件地址验证在使用正则表达式时通常会误入歧途。

答案 1 :(得分:1)

下面:

/^([a-z0-9_]\.?)*[a-z0-9_]+@([a-z0-9-_]+\.)+[a-z]{2,3}$/i

@之后的电子邮件地址部分可能是任何有效域,因此您需要在TLD上方允许任意数量的。分隔项 - 例如,email.staff.mycompany.com是有效的主机。此外,顶级域名中可包含2个以上的字符;许多常见的是3(.com,.net等)。

但是,下面的VoteyDisciple评论是有效的 - 从技术上讲,电子邮件地址可以包含..

答案 2 :(得分:1)

问题是字符类的工作原理:字符类,如[a-z0-9 ._] +,表示“其中一个 - 应用此规则一次或多次”。基本上,字符类的规则中没有任何内容,因此您不能重复字符。

诀窍在于,您希望将“单词”与句点分开,并且必须考虑该分组。

考虑这样的事情:

$rexMail = "/^[a-z0-9_]+(\.[a-z0-9_]+)*@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";

这基本上是说,“一个字(由字母数字或下划线组成),然后是OPTIONALLY(零次或多次)一个点,然后是另一个字。” (这可以重复多次或多次)

顺便提一下,{1}量词从来不是必需的,因为默认情况下,如果你没有指定量词,那么正则表达式引擎只会搜索一次。

答案 3 :(得分:0)

您可能会发现http://www.regular-expressions.info/email.html有用。使用正则表达式几乎不可能实现有效的电子邮件地址检查。但是,这个页面涉及几个替代方案。

我倾向于使用页面底部附近的那个。我发现它适合大多数Web应用程序使用,并稍微修改它以使用PHP转义:

//courtesy of http://www.regular-expressions.info/email.html, modified to be escaped for PHP string and preg_match
$exp = '[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';
if (! preg_match('/^'.$exp.'$/i', $email)) return false;

答案 4 :(得分:0)

您希望确保正则表达式尽可能宽松。因为它有许多有效的地址,它将无法匹配。

这是一个用于电子邮件语法验证工作的PHP库: http://code.google.com/p/php-email-address-validation/

在不向他们发送电子邮件的情况下实际验证电子邮件非常困难。但是SMTP验证在大多数情况下都有效,但是失败也应该被视为可能的失败,而不是实际的失败。

这是一个将通过SMTP验证电子邮件的类: http://code.google.com/p/php-smtp-email-validation/