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

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

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

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


当前回答

为所有内容编写正则表达式需要花费大量的精力。相反,您可以使用pyIsEmail包。

以下文字摘自pyIsEmail网站。

pyIsEmail是一种无意义的方法,用于检查用户提供的电子邮件地址是否真实。

正则表达式编写起来很便宜,但当新的顶级域出现或不符合重新流行的电子邮件寻址功能时,通常需要维护。pyIsEmail允许您通过一个简单的调用来验证电子邮件地址,如果您愿意的话,甚至可以检查域,从而使您的代码更易读,编写速度更快。当你想知道为什么电子邮件地址无法验证时,他们甚至会为你提供诊断。

用法

对于最简单的用法,请导入并使用is_email函数:

from pyisemail import is_email

address = "test@example.com"
bool_result = is_email(address)
detailed_result = is_email(address, diagnose=True)

您还可以检查电子邮件中使用的域是否为有效域,以及它是否具有有效的MX记录:

from pyisemail import is_email

address = "test@example.com"
bool_result_with_dns = is_email(address, check_dns=True)
detailed_result_with_dns = is_email(address, check_dns=True, diagnose=True)

这些是电子邮件地址是否可以在该域发出的主要指标。然而,这里的有效回复并不能保证电子邮件存在,仅仅是它可以存在。

除了基本的is_email功能之外,您还可以单独使用验证器。检查验证器源文档以了解其工作原理。

其他回答

以下是验证电子邮件地址的正则表达式:

^.+@\w+(\.\w+)+$

根据W3C和Wikipedia的有效正则表达式


[A-Z0-9a-z.!#$%&'*+-/=?^_`{|}~]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}

例如,!#$%&'*+-/=?^_`。{|}~@example.com

为了使用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;
    }
}

我用它,它很完美。

对于PHP,我使用Nette框架中的电子邮件地址验证器:

/* public static */ function isEmail($value)
{
    $atom = "[-a-z0-9!#$%&'*+/=?^_`{|}~]"; // RFC 5322 unquoted characters in local-part
    $localPart = "(?:\"(?:[ !\\x23-\\x5B\\x5D-\\x7E]*|\\\\[ -~])+\"|$atom+(?:\\.$atom+)*)"; // Quoted or unquoted
    $alpha = "a-z\x80-\xFF"; // Superset of IDN
    $domain = "[0-9$alpha](?:[-0-9$alpha]{0,61}[0-9$alpha])?"; // RFC 1034 one domain component
    $topDomain = "[$alpha](?:[-0-9$alpha]{0,17}[$alpha])?";
    return (bool) preg_match("(^$localPart@(?:$domain\\.)+$topDomain\\z)i", $value);
}

我使用

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

这是RegularExpressionValidator在ASP.NET中使用的值。