我最近读的地方,编写一regexp相匹配的电子邮件地址,考虑到所有变化和可能性的标准是极其困难和复杂得多于一个最初将承担。

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

是否有任何已知和被证明regexp,实际上这样做完全?

什么是一些良好的替代品的使用regexp为匹配的电子邮件地址?

有帮助吗?

解决方案

正式的 电子邮件的规范,是的,这在技术上是不可能通过Regex由于递归类的东西的意见(特别是如果不删除的意见的空白,第一个),并将各种不同的格式(一个电子邮件地址并不总是someone@somewhere.tld).你可以亲近(与一些大规模的和不可理解的Regex patterns),但是一个更好的方式检查电子邮件是要做的非常熟悉的握手:

  • 他们告诉你他们的电子邮件
  • 你的e-mail它们confimation链接与Guid
  • 当他们点击的链接,您知道:

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

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

其他提示

有许多Perl模块(例如)可以执行此操作。不要尝试编写自己的正则表达式来执行此操作。看看

Mail::VRFY将进行语法和网络检查(并且SMTP服务器在某处接受此地址)

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

RFC::RFC822::Address - 递归下降电子邮件地址解析器。

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

Mail::RFC822::Address - 基于regexp的地址验证,值得关注疯狂的正则表达式

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

其他语言也有类似的工具。疯狂的正则表达式......

(?:(?:\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*)

无论如何,验证电子邮件地址确实不是很有用。它不会捕获常见的拼写错误或虚构的电子邮件地址,因为它们在语法上看起来像有效地址。

如果您想确定地址有效,您别无选择,只能发送确认邮件。

如果您只是想确保用户输入的内容看起来像电子邮件而不仅仅是<!>“asdf <!>”,那么请检查@。更复杂的验证并没有真正带来任何好处。

(我知道这不能回答你的问题,但我认为无论如何都值得一提)

我现在已经整理了Cal Henderson,Dave Child,Phil Haack,Doug Lovell和RFC 3696的测试用例。总共有158个测试地址。

我针对我能找到的所有验证器运行了所有这些测试。比较如下: http://www.dominicsayers.com/isemail

我会尝试让这个页面保持最新状态,因为人们会增强验证器。感谢Cal,Dave和Phil在编写这些测试和对我自己的验证器

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

虽然允许诸如“+”之类的字符对于打击垃圾邮件的用户非常有用,但这并非全是无稽之谈。 myemail+sketchysite@gmail.com 即时一次性Gmail地址)。

仅在网站接受时才会接受。

BNF中有一个无上下文语法,用于描述 RFC-2822 。这很复杂。例如:

" @ "@example.com

是有效的电子邮件地址。我不知道有任何完全正确的正则表达式;通常给出的示例需要先删除注释。我写了一个递归下降解析器来完成一次。

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

如果您正在编写邮件服务器,那么您必须非常准确,并且在接受的内容方面要极其正确。 <!>“疯狂<!>”;因此上面引用的正则表达式是合适的。

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

坦率地说,在注册邮件列表,简报或网站时,有人真的关心让某人输入带有评论,换行,引号,空格,括号或其他乱码的200个字符的电子邮件地址吗?对这些小丑的正确回应是<!>“;当你的地址看起来像username@domain.tld <!>”时,请稍后回来。

我做的验证包括确保只有一个'@';没有空格,空格或换行符; '@'右边的部分至少有一个点(但不是一行中有两个点);并且没有引号,括号,逗号,冒号,感叹号,分号或反斜杠,所有这些都比实际电子邮件地址的部分更可能是hackery的尝试。

是的,这意味着我拒绝有人可能尝试在我的网站上注册的有效地址 - 也许我<!>“错误<!>”;拒绝多达0.001%的真实地址!我可以忍受。

报和其他各种很少使用,但有效的部分RFC使它难。我不知道足够关于这一主题发表评论明确,比其他"很难",但幸运的是 其他的 人们 关于它的长度。

作为一个有效的regex,Perl邮件::Rfc822::地址模块包含 一个经常的表达,它显然会工作 -但是,只有当的任何评论意见已被取代的空白。(注释中的一个电子邮件地址?你看,为什么它比人们可能期望...)

当然,简化regex比比皆是在其他地方将会进行验证的几乎每一个电子邮件地址,这是真正的正在使用的...

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

只是添加一个比@mmaibaum列出的那个更没有疯狂的正则表达式:

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

它不是防弹的,当然也不包括整个电子邮件规范,但它确实能够很好地覆盖大多数基本要求。更好的是,它有点易于理解,可以编辑。

来自 HouseOfFusion.com 的讨论,这是一个世界级的ColdFusion资源。

检查Java中的电子邮件地址的简单方法是使用Apache的EmailValidator Commons Validator 图书馆。

在发送电子邮件之前,我总是会在输入表格中检查一个电子邮件地址,即使您只是收到一些错别字。您可能不想为<!>添加自动扫描程序;交付失败<!>通知邮件。 : - )

这很难,因为根据电子邮件规范,电子邮件地址中有很多东西可以有效, RFC 2822 。你通常不会看到的东西如+是完全有效的电子邮件地址字符..根据规范。

http://regexlib.com ,这是一个很好的资源。我建议您确定哪些标准对您很重要并找到匹配的标准。大多数人真的不需要完全支持规范允许的所有可能性。

如果您在.NET Framework上运行,只需尝试实例化一个MailAddress对象并捕获FormatException如果它爆炸,或者如果成功则取出Address。没有任何关于捕获异常的性能的废话(实际上,如果这只是在一个Web表单上,它不会产生那么大的差别),.NET框架中的MailBnfHelper.ReadMailAddress()类经历了一个相当的完整的解析过程(它不使用RegEx)。打开Reflector并搜索<=>和<=>以查看它所做的所有花哨的东西。比我聪明的人花了很多时间在Microsoft构建解析器,当我实际向该地址发送电子邮件时我会使用它,所以我也可以用它来验证传入的地址。 / p>

许多人尝试过,很多人都接近了。您可能需要阅读维基百科文章 some 其他人

具体来说,您需要记住,许多网站和电子邮件服务器已经放宽了对电子邮件地址的验证,因此基本上它们没有完全实现标准。电子邮件一直在工作,这已经足够了。

试试这个:

"(?:[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标准,也许最好从另一个角度来看待它。如果邮件服务器没有镜像标准,那么标准所说的并不重要。所以我认为最好模仿最流行的邮件服务器在验证电子邮件地址时所做的事情。

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

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

撰写的

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

有两种类型的正则表达式可以验证电子邮件:

  1. 太松散了。
  2. 过于严格。
  3. 正则表达式不可能匹配所有有效的电子邮件地址,也不可能没有无效的电子邮件地址,因为某些字符串可能看起来像有效的电子邮件地址,但实际上并没有发送到任何人的收件箱。测试电子邮件是否真正有效的唯一方法是向该地址发送电子邮件,看看是否得到某种响应。考虑到这一点,在匹配电子邮件方面过于严格的正则表达似乎并没有太多的目的。

    我认为大多数要求使用电子邮件正则表达式的人都在寻找第一个选项,即松散的正则表达式。他们想测试一个字符串,看看它是否像电子邮件,如果它绝对不是电子邮件,那么他们可以对用户说:<!>嘿,你应该在这里发一封电子邮件这肯定不是一个有效的电子邮件。也许您没有意识到这个字段是用于发送电子邮件,或者可能存在拼写错误<!>;。

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

任何人都可以提供一些有关原因的见解吗?

是的,这是一个非常复杂的标准,允许许多今天没有人真正使用过的东西。 :)

是否有任何已知且经过验证的regexp实际上完全执行此操作?

这是一次完全解析整个标准的尝试......

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

使用正则表达式匹配电子邮件地址有哪些好的替代方法?

使用现有的框架,我猜你用的是哪种语言?虽然那些可能会在内部使用regexp。这是一个复杂的字符串。 Regexp旨在解析复杂的字符串,因此这是您的最佳选择。

编辑:我应该补充一点,我链接到的正则表达式只是为了好玩。我并不支持使用像这样的复杂正则表达式 - 有些人说<!>“如果你的正则表达式不止一行,那么它肯定会在某个地方出现错误<!>”。我联系它来说明标准的复杂程度。

添加 Wayne 的答案,还有一节关于 www.regular-expressions.info 致力于发送电子邮件,并提供一些样本。

你总是可以质疑它是否值得,或者实际上任何少于100% - 正在使用的regexp只会导致错误的安全感。

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

为了完成这篇文章,对于PHP,还有一个语言内置函数来验证电子邮件。

对于PHP使用具有特定EMAIL验证类型的nice filter_var:)

在php中没有更多疯狂的电子邮件正则表达式:D

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

http://www.php.net/filter_var

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top