多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
当前回答
当您使用PHP编写时,我建议您使用PHP内置的电子邮件验证。
filter_var($value, FILTER_VALIDATE_EMAIL)
如果您运行的是低于5.3.6的PHP版本,请注意这个问题:错误#53091:当我试图过滤一个大于2264个字符的文本时出现崩溃
如果您想了解此内置验证如何工作的更多信息,请参阅此处:PHP的filter_var filter_VALIDATE_EMAIL实际工作吗?
其他回答
列表项目
我使用此功能
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";
}
}
我使用多步骤验证。由于没有任何完美的方法来验证电子邮件地址,因此无法创建完美的电子邮件地址,但至少您可以通知用户他/她做错了什么-以下是我的方法:
我首先使用非常基本的正则表达式进行验证,它只检查电子邮件是否只包含一个@符号,并且在该符号之前或之后不为空。例如/^[^@\s]+@[^@\s]+$/如果第一个验证器没有通过(对于大多数地址来说,它应该通过,尽管它不是完美的),那么警告用户电子邮件无效,不允许他/她继续输入如果通过,则使用更严格的正则表达式进行验证,这可能会禁止有效的电子邮件。如果未通过,将警告用户可能发生错误,但允许用户继续。与步骤(1)不同,因为这是一个明显的错误,所以不允许用户继续。
换言之,第一次自由验证只是去除明显的错误,它被视为“错误”。人们键入了空白地址、没有@符号的地址等等。这应该被视为错误。第二个更严格,但它被视为“警告”,用户可以继续输入,但至少要检查他/她是否输入了有效的条目。这里的关键在于错误/警告方法——错误是在99.99%的情况下不能成为有效电子邮件的东西。
当然,您可以调整使第一个正则表达式更自由和第二个正则表达式更加严格的因素。
根据您的需要,上述方法可能适用于您。
[更新]我整理了我所知道的有关电子邮件地址验证的所有信息http://isemail.info,它现在不仅可以验证,还可以诊断电子邮件地址的问题。我同意这里的许多意见,即验证只是答案的一部分;看看我的文章什么是有效的电子邮件地址?。
据我所知,is_email()仍然是唯一一个能明确告诉您给定字符串是否为有效电子邮件地址的验证器。我已在上载了新版本http://isemail.info/
我整理了来自Cal Henderson、Dave Child、Phil Haack、Doug Lovell、RFC 5322和RFC 3696的测试用例。总共275个测试地址。我对我能找到的所有免费验证器进行了所有这些测试。
我会尽量让这个页面保持最新,因为人们会增强他们的验证器。感谢Cal、Michael、Dave、Paul和Phil在编译这些测试时的帮助和合作,以及对我自己的验证器的建设性批评。
人们应该特别注意RFC 3696的勘误表。其中三个典型示例实际上是无效地址。地址的最大长度是254或256个字符,而不是320个字符。
根据RFC 2821和RFC 2822,电子邮件地址的本地部分可以使用以下任意ASCII字符:
大写和小写字母数字0到9字符!#$%&'*+-/=^_`{|}~字符“.”,前提是它不是本地部分中的第一个或最后一个字符。
比赛:
一个&d@somedomain.com一个*d@somedomain.com一个/d@somedomain.com
不匹配项:
.abc@somedomain.comabc.@somedomain.coma>b@somedomain.com
对于符合RFC 2821和2822的,可以使用:
^((([!#$%&'*+\-/=?^_`{|}~\w])|([!#$%&'*+\-/=?^_`{|}~\w][!#$%&'*+\-/=?^_`{|}~\.\w]{0,}[!#$%&'*+\-/=?^_`{|}~\w]))[@]\w+([-.]\w+)*\.\w+([-.]\w+)*)$
电子邮件-符合RFC 2821、2822
我发现了一篇很好的文章,其中说验证电子邮件地址的最佳方法是正则表达式/.+@.+\+/一、。