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

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

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

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


当前回答

[更新]我整理了我所知道的有关电子邮件地址验证的所有信息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个字符。

其他回答

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

我用它,它很完美。

我不知道什么是最好的,但这一条至少是正确的,只要地址的注释被删除并用空格替换。

认真地您应该使用已编写的库来验证电子邮件。最好的方法可能是向该地址发送验证电子邮件。

电子邮件正则表达式(RFC 5322)

(?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[0-9a-z](?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)?[0-9a-z]@))(?=.{1,255}$)(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9])|((?=.{1,63}$)[0-9a-z][-\w]*))$

演示https://regex101.com/r/ObS3QZ/1

# (?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[0-9a-z](?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)?[0-9a-z]@))(?=.{1,255}$)(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9])|((?=.{1,63}$)[0-9a-z][-\w]*))$

# Note - remove all comments '(comments)' before running this regex
# Find  \([^)]*\)  replace with nothing

(?im)                                     # Case insensitive
^                                         # BOS

                                          # Local part
(?= .{1,64} @ )                           # 64 max chars
(?:
     (                                         # (1 start), Quoted
          " [^"\\]*
          (?: \\ . [^"\\]* )*
          "
          @
     )                                         # (1 end)
  |                                          # or,
     (                                         # (2 start), Non-quoted
          (?:
               [0-9a-z]
               (?:
                    \.
                    (?! \. )
                 |                                          # or,
                    [-!#\$%&'\*\+/=\?\^`\{\}\|~\w]
               )*
          )?
          [0-9a-z]
          @
     )                                         # (2 end)
)
                                          # Domain part
(?= .{1,255} $ )                          # 255 max chars
(?:
     (                                         # (3 start), IP
          \[
          (?: \d{1,3} \. ){3}
          \d{1,3} \]
     )                                         # (3 end)
  |                                          # or,
     (                                         # (4 start), Others
          (?:                                       # Labels (63 max chars each)
               (?= .{1,63} \. )
               [0-9a-z] [-\w]* [0-9a-z]*
               \.
          )+
          [a-z0-9] [\-a-z0-9]{0,22} [a-z0-9]
     )                                         # (4 end)
  |                                          # or,
     (                                         # (5 start), Localdomain
          (?= .{1,63} $ )
          [0-9a-z] [-\w]*
     )                                         # (5 end)
)
$                                         # EOS

对于Angular2/Angular7,我使用以下模式:

emailPattern=“^[a-zA-Z0-9-_.+-]+@[a-zA-APP-GW-9-]+[.]+[a-zA-62-9-.]+(\\s)*”;私有createForm(){this.form=this.formBuilder.group({email:['',[Validators.required,Validators.pattern(this.emailPattern)]]});}

它还允许在结尾处添加额外的空间,在将其发送到后端之前,应该将其截断,但某些用户,特别是移动用户,很容易在结尾处错误地添加空间。

如前所述,您不能使用正则表达式验证电子邮件。然而,这是我们目前用来确保用户输入不是完全虚假的(忘记TLD等)。

此正则表达式将允许IDN域和@符号前后的特殊字符(如Umlauts)。

/^[\w.+-_]+@[^.][\w.-]*\.[\w-]{2,63}$/iu