用于电子邮件验证的正则表达式:错误在哪里?

时间:2012-10-09 14:48:48

标签: php regex email email-validation

这听起来很奇怪,但我现在已经使用这个功能很长一段时间了,“突然间,从一天到另一天”它不再以正确的方式过滤一些地址。但是,我不明白为什么......

function validate_email($email)
{
/*
(Name) Letters, Numbers, Dots, Hyphens and Underscores
(@ sign)
(Domain) (with possible subdomain(s) ).
Contains only letters, numbers, dots and hyphens (up to 255 characters)
(. sign)
(Extension) Letters only (up to 10 (can be increased in the future) characters)
*/

$regex = '/([a-z0-9_.-]+)'. # name

'@'. # at

'([a-z0-9.-]+){2,255}'. # domain & possibly subdomains

'.'. # period

'([a-z]+){2,10}/i'; # domain extension 

if($email == '') { 
    return false;
}
else {
$eregi = preg_replace($regex, '', $email);
}

return empty($eregi) ? true : false;
}

e.g。 “some @ gmail”会显示为正确等等所以它似乎发生在tld上 - 有人能告诉我为什么吗?

非常感谢你!

4 个答案:

答案 0 :(得分:2)

.表示任何角色。如果你的意思是“点”,你应该逃避它:\.

你的正则表达式还有其他一些问题:

  • 正则表达式中不允许使用大写字母:[a-zA-Z0-9]
  • 正则表达式中不允许使用unicode字符(例如带有é,ç,...等的电子邮件地址)
  • 事实上,+中的某些特殊字符允许在电子邮件地址
  • 中使用
  • ...

我会保持电子邮件验证非常简单。比如检查是否存在@ present并且几乎保持它。如果您确实要验证电子邮件,则正则表达式将变为gruesome

检查this SO答案以获得更详细的解释。

答案 1 :(得分:1)

您对“期间”所评论的内容:

'.'. # period

实际上是任何角色的占位符。它应该是\.

但是,你过度复杂了。应该存在这样的验证以拒绝空字段或明显错误的东西(例如,放在电子邮件字段中的名称)。因此,根据我的经验,最好的检查只是查看它是否包含@并且不要过于担心结构正确。您可以实际上写一个正则表达式,它将忠实地验证任何有效的电子邮件地址并拒绝任何无效的电子邮件地址。这是一个跨越文本屏幕的怪物。不要那样做。 KISS。

答案 2 :(得分:1)

我认为错误就在这一行:

'.'. # period 

你的意思是这里的文字时期。但是句子在正则表达式中具有特殊含义(它们意味着“任何字符”)。

你需要用反斜杠来逃避它。

答案 3 :(得分:0)

FILTER_VALIDATE_EMAIL

怎么样?