0

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

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 发生了某事 - 有人能告诉我为什么吗?

非常感谢您!

4

4 回答 4

2

.表示任何字符。如果您实际上是指“点”,则应该转义它:\.

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

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

我会保持电子邮件验证非常简单。就像检查是否有 @ 礼物并且几乎保持它。因为如果你真的想验证一封电子邮件,正则表达式会变得很可怕

检查这个SO answer 以获得更详细的解释。

于 2012-10-09T14:51:36.753 回答
1

您用“句号”评论的内容:

'.'. # period

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

然而,你把事情复杂化了。应该存在这样的验证来拒绝空字段或明显错误的内容(例如,将姓名放在电子邮件字段中)。所以根据我的经验,最好的检查就是看看它是否包含一个@并且不要太担心结构是否正确。实际上,您可以编写一个正则表达式,它将忠实地验证任何有效的电子邮件地址并拒绝任何无效的电子邮件地址。这是一个横跨文本屏幕的怪物。不要那样做。吻。

于 2012-10-09T14:51:13.337 回答
1

我认为错误在这一行:

'.'. # period 

你的意思是一个字面上的时期。但是句点在正则表达式中具有特殊含义(它们的意思是“任何字符”)。

您需要使用反斜杠对其进行转义。

于 2012-10-09T14:52:38.383 回答
0

FILTER_VALIDATE_EMAIL怎么样

于 2012-10-09T14:53:50.160 回答