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

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

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

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


当前回答

我已经使用OP的正则表达式的这个修改版本有一段时间了,它并没有给我留下太多惊喜。我从未在电子邮件中遇到过撇号,所以这并不能证明这一点。它确实验证了Jean+François@anydomain.museum和试@例子.测试.مثال.آسایل,但不奇怪地滥用这些非字母数字字符+@you.com上。

(?!^[.+&'_-]*@.*$)(^[_\w\d+&'-]+(\.[_\w\d+&'-]*)*@[\w\d-]+(\.[\w\d-]+)*\.(([\d]{1,3})|([\w]{2,}))$)

它确实支持IP地址you@192.168.1.1,但我还没有完善到足以处理诸如999.999.999.1之类的伪IP地址范围。

它还支持超过三个字符的所有TLDasdf@asdf.asdf我认为这是原作的表现。我被打败了,现在有太多超过3个字符的TLD。

我知道OP已经放弃了他的正则表达式,但这种味道仍然存在。

其他回答

我使用多步骤验证。由于没有任何完美的方法来验证电子邮件地址,因此无法创建完美的电子邮件地址,但至少您可以通知用户他/她做错了什么-以下是我的方法:

我首先使用非常基本的正则表达式进行验证,它只检查电子邮件是否只包含一个@符号,并且在该符号之前或之后不为空。例如/^[^@\s]+@[^@\s]+$/如果第一个验证器没有通过(对于大多数地址来说,它应该通过,尽管它不是完美的),那么警告用户电子邮件无效,不允许他/她继续输入如果通过,则使用更严格的正则表达式进行验证,这可能会禁止有效的电子邮件。如果未通过,将警告用户可能发生错误,但允许用户继续。与步骤(1)不同,因为这是一个明显的错误,所以不允许用户继续。

换言之,第一次自由验证只是去除明显的错误,它被视为“错误”。人们键入了空白地址、没有@符号的地址等等。这应该被视为错误。第二个更严格,但它被视为“警告”,用户可以继续输入,但至少要检查他/她是否输入了有效的条目。这里的关键在于错误/警告方法——错误是在99.99%的情况下不能成为有效电子邮件的东西。

当然,您可以调整使第一个正则表达式更自由和第二个正则表达式更加严格的因素。

根据您的需要,上述方法可能适用于您。

您可以对任何电子邮件地址使用以下正则表达式:

^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$

对于PHP

function checkEmailValidation($email)
{
    $expression = '/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/';
    if(preg_match($expression, $email))
    {
        return true;
    }
    else
    {
        return false;
    }
}

对于JavaScript

function checkEmailValidation(email)
{
    var pattern = '/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/';
    if(pattern.test(email))
    {
        return true;
    }
    else
    {
        return false;
    }
}

我也有类似的愿望:希望快速检查电子邮件地址中的语法,而不要过分使用电子邮件发送实用程序(邮件::RFC822::地址答案显然是正确的答案)。我同意这个(我是一个POSIX正则表达式的人,所以我通常不会使用PCRE中的\d等,因为它们让我看不清楚):

preg_match("_^[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*@[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?)*\$_", $adr)

这是RFC正确的,但它明确排除了过时的表单以及直接IP地址(IP地址和传统IP地址),而该实用程序的目标组中的某些人(主要是:在IRC上的#sendmail中打扰我们的人)通常不希望或不需要这些地址。

IDN(国际化域名)明确不在电子邮件范围内:地址如“foo@cäcilenchor bonn.de“必须写”foo@xn--ccilienchor-bonn-vnb.de而在网络上(这包括HTML中的mailto:links和这样的乐趣),只允许GUI向用户显示(并接受然后转换)这样的名称。

Java Mail API为我们带来了魔力。

try
{
    InternetAddress internetAddress = new InternetAddress(email);
    internetAddress.validate();
    return true;
}
catch(Exception ex)
{
    return false;
}

我从这里得到了这个。

这一切都取决于你想要的准确度。出于我的目的,我只是想避开bob@aol.com(电子邮件中的空格)或steve(完全没有域名)或mary@aolcom(在.com之前没有句点),我使用

/^\S+@\S+\.\S+$/

当然,它会匹配不是有效电子邮件地址的内容,但这是一个常见的简单错误问题。

可以对该正则表达式进行任意数量的更改(其中一些在这个答案的注释中),但它很简单,易于理解,是一个很好的第一次尝试。