繁体   English   中英

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

[英]regex for email validation: where is the error?

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

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;
}

例如,“ some @ gmail”将显示为正确,以此类推,TLD似乎已发生某事-有人能告诉我为什么吗?

提前非常感谢您!

. 表示任何字符。 如果您的意思是“点”: \\.则应转义它\\.

您的正则表达式还存在其他一些问题:

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

我将使电子邮件验证非常简单。 像检查是否有@ present一样,几乎保持不变。 因为如果您真的想验证电子邮件,则正则表达式会令人讨厌

检查 SO答案以获得更详细的说明。

您对“句点”的评论:

'.'. # period

实际上是任何字符的占位符。 应该是\\. 代替。

但是,您使事情变得过于复杂。 应该存在这样的验证,以拒绝空字段或明显错误的内容(例如,电子邮件字段中输入的名称)。 因此,以我的经验来看,最好的检查就是查看它是否包含@并且不必过于担心正确的结构。 实际上,您可以编写一个正则表达式,它将忠实地验证任何有效的电子邮件地址并拒绝任何无效的电子邮件地址。 这是一个跨越文本屏幕的怪物。 不要那样做 吻。

我认为错误在这一行:

'.'. # period 

您的意思是这里的字面量。 但是句点在正则表达式中有特殊含义(它们表示“任何字符”)。

您需要使用反斜杠将其转义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM