多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
当前回答
Cal Henderson(Flickr)写了一篇名为《用PHP解析电子邮件地址》的文章,并展示了如何正确解析符合RFC(2)822的电子邮件地址。
您还可以获得PHP、Python和Ruby的源代码,这是CreativeCommons许可的。
其他回答
我不知道什么是最好的,但这一条至少是正确的,只要地址的注释被删除并用空格替换。
认真地您应该使用已编写的库来验证电子邮件。最好的方法可能是向该地址发送验证电子邮件。
问题标题相当通用,但是问题的主体表明它是关于基于PHP的解决方案的。将尝试解决这两个问题。
一般来说,对于所有编程语言:典型的验证“带有reg ex的电子邮件地址是任何基于互联网的服务提供商都应该避免的事情。域名和电子邮件地址种类的可能性已经大大增加,任何验证尝试都可能会导致拒绝某些有效用户进入您的系统。为了避免这种情况,最好的方法之一是向用户发送电子邮件确认它被接收。“普遍接受指导小组”的好朋友们编制了一份按语言排列的库列表,发现这些库符合/不符合与国际化域名和国际化电子邮件地址相关的各种参数。请在这里和这里找到这些文档的链接。
具体来说PHP:
PHP中有一个很好的库,即EmailValidator。它是一个电子邮件地址验证器,包括许多验证方法,如DNS验证。特别推荐的验证器称为RFCValidator,并根据多个RFC验证电子邮件地址。它在包容IDN和国际化电子邮件地址方面具有良好的合规性。
根据W3C和Wikipedia的有效正则表达式
[A-Z0-9a-z.!#$%&'*+-/=?^_`{|}~]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}
例如,!#$%&'*+-/=?^_`。{|}~@example.com
我总是使用下面的正则表达式来验证电子邮件地址。它涵盖了基于英语字符的所有电子邮件地址格式。
"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";
下面是一个C#示例:
添加程序集引用:
using System.Text.RegularExpressions;
并使用下面的方法传递电子邮件地址并得到一个布尔值
private bool IsValidEmail(string email) {
bool isValid = false;
const string pattern = @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";
isValid = email != "" && Regex.IsMatch(email, pattern);
// Same above approach in multiple lines
//
//if (!email) {
// isValid = false;
//} else {
// // email param contains a value; Pass it to the isMatch method
// isValid = Regex.IsMatch(email, pattern);
//}
return isValid;
}
此方法验证传入参数的电子邮件字符串。对于param为null、空字符串、未定义或param值不是有效电子邮件地址的所有情况,它都将返回false。只有当参数包含有效的电子邮件地址字符串时,它才会返回true。
为所有内容编写正则表达式需要花费大量的精力。相反,您可以使用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功能之外,您还可以单独使用验证器。检查验证器源文档以了解其工作原理。