多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。

我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。

你有或见过验证电子邮件的最佳正则表达式是什么?

我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。


当前回答

根据我的理解,它很可能会被。。。

/^([a-z0-9_-]+)(@[a-z0-9-]+)(\.[a-z]+|\.[a-z]+\.[a-z]+)?$/is

其他回答

几乎添加了一个新域“yandex”。可能的电子邮件:test@job.yandex.而且还支持大写字母,因此acrosman解决方案的一个小修改版本是:

^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,6})$

为了使用JavaScript验证电子邮件地址,使用此功能更方便和高效(根据W3Schools):

function validateEmail()
{
    var x = document.f.email.value;
    var atpos = x.indexOf("@");
    var dotpos = x.lastIndexOf(".");
    if (atpos < 1 || dotpos < atpos+2 || dotpos+2 >= x.length)
    {
        alert("Not a valid e-mail address");
        return false;
    }
}

我用它,它很完美。

奇怪的是,您“不能”使用4个字符的TLD。您禁止人们使用.info和.name,以及长度限制stop、travel和.museum,但是的,它们比2个字符的TLD和3个字符的TLC更常见。

你也应该允许大写字母。电子邮件系统将规范本地部分和域部分。

对于域部分的正则表达式,域名不能以'-'开头,也不能以'-'结尾。Dash只能介于两者之间。

如果您使用PEAR库,请查看他们的邮件功能(我忘记了确切的名称/库)。您可以通过调用一个函数来验证电子邮件地址,它根据RFC 822中的定义验证电子邮件地址。

没有一个是真正有用的。我在回答“是否有用于电子邮件地址验证的PHP库?”时讨论了一些问题?,它也在电子邮件地址的正则表达式识别难吗?中讨论?。

简而言之,不要期望一个可用的正则表达式能够完成正确的工作。最好的正则表达式将验证语法,而不是电子邮件的有效性(jhohn@example.com是正确的,但它可能会反弹…)。

Cal Henderson(Flickr)写了一篇名为《用PHP解析电子邮件地址》的文章,并展示了如何正确解析符合RFC(2)822的电子邮件地址。

您还可以获得PHP、Python和Ruby的源代码,这是CreativeCommons许可的。