多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
当前回答
这个简单的模式适用于我:
^(?<name>[^<>#()\.,;\s@\"]{1,})@(?<domain>[^<>#()\.,;\s@\"]{2,}\.(?<top>[^<>#()\.,;:\s@\"]{2,}))$
其他回答
没有一个是真正有用的。我在回答“是否有用于电子邮件地址验证的PHP库?”时讨论了一些问题?,它也在电子邮件地址的正则表达式识别难吗?中讨论?。
简而言之,不要期望一个可用的正则表达式能够完成正确的工作。最好的正则表达式将验证语法,而不是电子邮件的有效性(jhohn@example.com是正确的,但它可能会反弹…)。
问题标题相当通用,但是问题的主体表明它是关于基于PHP的解决方案的。将尝试解决这两个问题。
一般来说,对于所有编程语言:典型的验证“带有reg ex的电子邮件地址是任何基于互联网的服务提供商都应该避免的事情。域名和电子邮件地址种类的可能性已经大大增加,任何验证尝试都可能会导致拒绝某些有效用户进入您的系统。为了避免这种情况,最好的方法之一是向用户发送电子邮件确认它被接收。“普遍接受指导小组”的好朋友们编制了一份按语言排列的库列表,发现这些库符合/不符合与国际化域名和国际化电子邮件地址相关的各种参数。请在这里和这里找到这些文档的链接。
具体来说PHP:
PHP中有一个很好的库,即EmailValidator。它是一个电子邮件地址验证器,包括许多验证方法,如DNS验证。特别推荐的验证器称为RFCValidator,并根据多个RFC验证电子邮件地址。它在包容IDN和国际化电子邮件地址方面具有良好的合规性。
这是我使用的PHP代码。我选择这个解决方案是出于“误报比误报好”的精神,正如这里的另一位评论者所说的,并考虑到保持您的响应时间并降低服务器负载。。。当正则表达式可以消除大多数简单的用户错误时,真的不需要浪费服务器资源。如果你愿意,你可以随时通过发送测试邮件来跟进。
function validateEmail($email) {
return (bool) stripos($email,'@');
}
我已经使用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已经放弃了他的正则表达式,但这种味道仍然存在。
列表项目
我使用此功能
function checkmail($value) {
$value = trim($value);
if (stristr($value,"@") &&
stristr($value,".") &&
(strrpos($value, ".") - stripos($value, "@") > 2) &&
(stripos($value, "@") > 1) &&
(strlen($value) - strrpos($value, ".") < 6) &&
(strlen($value) - strrpos($value, ".") > 2) &&
($value == preg_replace('/[ ]/', '', $value)) &&
($value == preg_replace('/[^A-Za-z0-9\-_.@!*]/', '', $value))
)
{
}
else {
return "Invalid Mail-Id";
}
}