多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
当前回答
我发现了一篇很好的文章,其中说验证电子邮件地址的最佳方法是正则表达式/.+@.+\+/一、。
其他回答
如果您可以接受空值(这不是无效的电子邮件),并且正在运行PHP 5.2+,我建议您:
static public function checkEmail($email, $ignore_empty = false) {
if($ignore_empty && (is_null($email) || $email == ''))
return true;
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
为了使用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;
}
}
我用它,它很完美。
如前所述,您不能使用正则表达式验证电子邮件。然而,这是我们目前用来确保用户输入不是完全虚假的(忘记TLD等)。
此正则表达式将允许IDN域和@符号前后的特殊字符(如Umlauts)。
/^[\w.+-_]+@[^.][\w.-]*\.[\w-]{2,63}$/iu
我想提出我的方法,它相对简单,同时确保正确的电子邮件结构和限制禁止字符。对拉丁字符有效。
/^(?![\w\.@]*\.\.)(?![\w\.@]*\.@)(?![\w\.]*@\.)\w+[\w\.]*@[\w\.]+\.\w{2,}$/
这是我做的。它不是防弹版,但它“简单”,几乎可以检查所有内容。
[\w+-]+(?:\.[\w+-]+)*@[\w+-]+(?:\.[\w+-]+)*(?:\.[a-zA-Z]{2,4})
我认为已经有了解释,因此您可以根据需要进行修改:
(e) [\w+-]+匹配a-z、a-z、_、+、-至少一次
(m) (?:\.[\w+-]+)*匹配a-z、a-z、_、+、-0或更多次,但需要以a开头。(点)
@ = @
(i) [\w+-]+匹配a-z、a-z、_、+、-至少一次
(l) (?:\.[\w+-]+)*匹配a-z、a-z、_、+、-0或更多次,但需要以a开头。(点)
(com)(?:\.[a-zA-Z]{2,4})匹配a-Z,a-Z 2到4次,从a开始。(点)
给出e(-m)@i(.l).com,其中(.m)和(.l)是可选的,但也可以重复多次。
我认为这会验证所有有效的电子邮件地址,但会阻止潜在的无效地址,而不使用在大多数情况下不需要的过于复杂的正则表达式。
请注意,这将允许+@-.com,但这是保持简单的折衷方案。