正则expression式识别电子邮件地址很难?

我最近读了一个地方,写一个正则expression式来匹配一个电子邮件地址,考虑到标准的所有变化和可能性是非常困难的,并且比最初假定的要复杂得多。

任何人都可以提供一些见解,为什么这是?

是否有任何已知的和certificate的正则expression式实际上完成这个吗?

使用正则expression式匹配电子邮件地址有什么好的select?

对于正式的电子邮件规范,是的,通过正则expression式在技术上是不可能的,因为像recursion注释这样的事情(特别是如果你不先删除对空白的注释),以及各种不同的格式(电子邮件地址isn总是someone@somewhere.tld)。 你可以靠近(有一些庞大而难以理解的正则expression式模式),但检查电子邮件的好方法是做非常熟悉的握手:

  • 他们告诉你他们的电子邮件
  • 你通过电子邮件发送给他们一个Guid的configuration链接
  • 当他们点击链接时,您知道:

    1. 电子邮件是正确的
    2. 它存在
    3. 他们拥有它

比盲目接受电子邮件地址更好。

有很多Perl模块(例如)可以做到这一点。 不要尝试写自己的正则expression式来做到这一点。 看着

Mail::VRFY将执行语法和networking检查(是否有SMTP服务器接受此地址)

https://metacpan.org/pod/Mail::VRFY

RFC::RFC822::Address – recursion下降电子邮件地址parsing器。

https://metacpan.org/pod/RFC::RFC822::Address

Mail::RFC822::Address – 基于regexp的地址validation,值得一看的疯狂的正则expression式

http://ex-parrot.com/~pdw/Mail-RFC822-Address.html

其他语言也有类似的工具。 疯狂的正则expression式下面…

 (?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t] )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?: \r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:( ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0 31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\ ](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+ (?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?: (?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z |(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n) ?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\ r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n) ?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t] )*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])* )(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t] )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*) *:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+ |\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r \n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?: \r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t ]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031 ]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\]( ?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(? :(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(? :\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(? :(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)? [ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]| \\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<> @,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|" (?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t] )*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\ ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(? :[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[ \]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000- \031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|( ?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,; :\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([ ^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\" .\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\ ]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\ [\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\ r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\] |\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0 00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\ .|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@, ;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(? :[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])* (?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\". \[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[ ^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\] ]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*( ?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\ ".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:( ?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[ \["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t ])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t ])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(? :\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+| \Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?: [^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\ ]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n) ?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[" ()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n) ?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<> @,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@, ;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t] )*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\ ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)? (?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\". \[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?: \r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[ "()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t]) *))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]) +|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\ .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z |(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:( ?:\r\n)?[ \t])*))*)?;\s*) 

无论如何,validation电子邮件地址并不是非常有用。 它不会捕获常见的拼写错误或电子邮件地址,因为这些地址在语法上看起来像有效的地址。

如果你想确定一个地址是有效的,你别无select,只能发送确认邮件。

如果你只是想确保用户input的东西看起来像一个电子邮件,而不是“asdf”,然后检查@。 更复杂的validation并不能真正提供任何好处。

(我知道这不能回答你的问题,但我认为这是值得一提的)

我现在整理了来自Cal Henderson,Dave Child,Phil Haack,Doug Lovell和RFC 3696的testing用例。

我对所有可以find的validation器都运行了所有这些testing。 比较在这里: http : //www.dominicsayers.com/isemail

我会尽量保持这个页面是最新的,因为人们提高validation。 感谢Cal,Dave和Phil在编写这些testing方面提供的帮助和合作,并对我自己的validation器进行了build设性的批评。

人们应该特别注意对RFC 3696的勘误 。 其中三个规范的例子实际上是无效的地址。 而地址的最大长度是254或256个字符, 而不是 320。

尽pipe允许诸如“+”这样的字符对于防止垃圾邮件的用户非常有用,例如myemail+sketchysite@gmail.com ( 即时 可用的 Gmail地址 ), 但这并非全是废话。

只有当一个网站接受它。

BNF中有一个上下文无关语法,用于描述RFC-2822中的有效电子邮件地址。 这很复杂。 例如:

 " @ "@example.com 

是有效的电子邮件地址。 我不知道有什么正则expression式可以完成它。 通常给出的例子需要首先剥离评论。 我写了一个recursion下降parsing器完成一次。

在我看来,是否接受奇怪,不寻常的电子邮件地址格式取决于他们想要做什么。

如果你正在写一个邮件服务器,你必须非常确切和严格地接受你所接受的内容。 因此上面引用的“疯狂的”正则expression式是适当的。

然而,对于我们其他人来说,我们主要只是想确保用户在Web表单中input的内容看起来合理,并且没有某种SQL注入或缓冲区溢出。

坦率地说,在注册邮件列表,通讯或网站时,是否有人真的关心让别人input带有评论,换行符,引号,空格,括号或其他乱码的200个字符的电子邮件地址? 对这样的小丑的正确回应是“稍后回来,当你有一个地址,看起来像username@domain.tld”。

我做的validation包括确保只有一个“@”; 没有空格,空值或换行符; “@”右侧的部分至less有一个点(但不是连续的两个点); 并且没有引号,括号,逗号,冒号,惊叹号,分号或反斜杠,所有这些都比实际的电子邮件地址的部分更可能是骇人听闻的尝试。

是的,这意味着我拒绝有人可能试图在我的网站上注册的有效地址 – 也许我“错误地”拒绝多达0.001%的实际地址! 我可以忍受这一点。

引用和RFC中的其他各种很less使用但有效的部分使其变得困难。 对于这个话题我还不太清楚,除了“很难”之外,幸好其他人都写了很多。

至于它的一个有效的正则expression式,Perl Mail :: Rfc822 :: Address模块​​包含一个正则expression式,这将显然工作 – 但只有当任何评论已被replace为空白。 (在一个电子邮件地址的评论?你明白为什么比预期的更难…)

当然,其他地方的简化正则expression式几乎可以validation每个真正被使用的电子邮件地址。

一些正则expression式可以匹配嵌套的括号(例如Perl兼容的)。 也就是说,我看到一个声称正确匹配RFC 822的正则expression式,它是两页没有任何空格的文本。 因此,检测有效的电子邮件地址的最好方法是发送电子邮件给它,看看它是否工作。

只是添加一个比@mmaibaum列出的正则expression式更疯狂的正则expression式:

 ^[a-zA-Z]([.]?([a-zA-Z0-9_-]+)*)?@([a-zA-Z0-9\-_]+\.)+[a-zA-Z]{2,4}$ 

这不是防弹的,当然不能覆盖整个电子邮件规范,但它确实覆盖了最基本的要求。 更好的是,它有点理解,可以编辑。

在世界级的ColdFusion资源HouseOfFusion.com的讨论中被打了折扣 。

在Java中检查电子邮件地址的简单而好的方法是使用Apache Commons Validator库的EmailValidator。

在发送电子邮件之前,我会经常在input表单中检查电子邮件地址,即使只是发现一些错误。 您可能不想为“投递失败”通知邮件写一个自动扫描器。 🙂

这真的很难,因为根据电子邮件规范RFC 2822 ,在电子邮件地址中有很多东西是有效的。 通常不会看到的东西,例如+,对于电子邮件地址来说是完全有效的字符。根据规范。

http://regexlib.com有专门的电子邮件地址,这是一个很好的资源。; 我build议你确定什么标准对你很重要,并find一个匹配。 大多数人真的不需要完全支持规范允许的所有可能性。

如果你在.NET Framework上运行,只要尝试实例化一个MailAddress对象,如果它爆炸,就捕获FormatException ,或者如果成功的话就拉出Address 。 没有深入了解捕获exception的性能(实际上,如果这只是在一个单独的Web表单上,它不会产生太大的差别),.NET框架中的MailAddress类会经历一个相当完整的parsing过程(它不使用RegEx)。 打开reflection器,并searchMailAddressMailBnfHelper.ReadMailAddress()来查看它所做的所有花哨的东西。 比我聪明的人在微软花费了大量的时间来构buildparsing器,当我真正发送电子邮件到这个地址的时候,我会用它,所以我也可以用它来validation传入的地址。

许多人已经尝试,许多人接近。 你可能想阅读维基百科的文章 ,和其他一些 。

具体来说,你会想记住,许多网站和电子邮件服务器已经放宽了电子邮件地址的validation,所以基本上他们没有完全实现标准。 尽pipe电子邮件一直在工作,但这足够了。

试试这个:

 "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])" 

看看这里的细节。

但是,不是执行RFC822标准,也许从另一个angular度来看它会更好。 如果邮件服务器不反映这个标准,那么这个标准说的并不重要。 所以我会争辩说,模拟最stream行的邮件服务器在validation电子邮件地址时会做的更好。

Java的这个类有一个validation器: http : //www.leshazlewood.com/? p =23

这是Shiro的创build者(正式Ki,正式的JSecurity)

testing电子邮件地址有效性的利弊:

有两种types的正则expression式来validation电子邮件:

  1. 那些太松散了。
  2. 那些太严格了。

正则expression式无法匹配所有有效的电子邮件地址,也无法匹配无效的电子邮件地址,因为某些string可能看起来像有效的电子邮件地址,但实际上并不会发送到任何人的收件箱。 testing电子邮件是否真正有效的唯一方法是发送电子邮件到该地址,看看你是否得到某种回应。 考虑到这一点,对匹配电子邮件过于严格的正则expression式似乎并没有太多的目的。

我认为,大多数要求电子邮件正则expression式的人正在寻找第一个选项,太宽松的正则expression式。 他们想testing一个string,看它是否看起来像电子邮件,如果它绝对不是电子邮件,那么他们可以对用户说:“嘿,你应该在这里发一封电子邮件,这绝对是不是有效的电子邮件,也许你没有意识到,这个领域是一个电子邮件或者可能是一个错字“。

如果用户放入的string看起来很像一个有效的电子邮件,但实际上不是一个,那么这是一个应该由应用程序的不同部分处理的问题。

任何人都可以提供一些见解,为什么这是?

是的,这是一个非常复杂的标准,允许很多没有人真正使用的东西。 🙂

是否有任何已知的和certificate的正则expression式实际上完成这个吗?

这是一个完全parsing整个标准的尝试。

http://ex-parrot.com/~pdw/Mail-RFC822-Address.html

使用正则expression式匹配电子邮件地址有什么好的select?

使用现有的框架,无论你使用什么语言我猜? 虽然这些可能会在内部使用正则expression式。 这是一个复杂的string。 正则expression式旨在parsing复杂的string,所以这真的是您的最佳select。

编辑 :我应该补充说,我链接到正则expression式只是为了好玩。 我不认可使用这样复杂的正则expression式 – 有些人说:“如果你的正则expression式不止一行,肯定会在某个地方出现错误”。 我把它和它联系起来来说明标准是多么复杂。

除了韦恩的回答,还有一个关于www.regular-expressions.info专门用于电子邮件的部分,还有一些样本。

你总是可以质疑是否值得,或者实际上任何小于100%的正则expression式只会造成虚假的安全感。

最后,实际上发送电子邮件是什么将提供真正的最终validation。 (你会发现如果你的邮件服务器有错误;-)

为了完整的这篇文章,也为PHP有​​一个语言内置函数来validation电子邮件。

对于PHP使用具有特定EMAILvalidationtypes的nice filter_var 🙂

在PHP中没有更疯狂的电子邮件正则expression式:D

 var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)); 

http://www.php.net/filter_var

Interesting Posts