5471

在发送到服务器或尝试发送电子邮件之前,我想检查用户输入是否是JavaScript中的电子邮件地址,以防止最基本的错误输入。我如何才能做到这一点?

9
  • 23
    @Alex我添加此评论的原因是,接受的答案中建议的正则表达式不允许现有的实时电子邮件地址,这对客户来说是一个糟糕的开始,而真正的大问题是,即使接受了地址,它也没有说明它是否有效。要可靠地验证所提供的电子邮件是否有效,唯一的方法是发送带有验证链接的邮件。因此,如果您的用例不要求您验证电子邮件,只需对@进行最小测试,否则使用验证电子邮件。Regex只会提供糟糕的用户体验。 评论 2021年5月3日14:56
  • @大卫·马尔滕森,我给你的想法加了一个+。然而,我确实认为验证电子邮件链接的事情也可能是糟糕的用户体验。这可能会让你失去客户。 评论 2021年6月3日10:22
  • 7
    @mikael1000当然,但是当您不知道它是否是有效的电子邮件时,regex验证的目的是什么。如果您不想使用验证链接来打扰客户,只需在<something>中执行最简单的验证<somethang>,然后就这样做。它将确保客户至少添加了一些可能是电子邮件的内容,更重要的是,在您进行实际验证之前,这主要是浪费代码。您可以通过dns查找检查域是否存在。 评论 2021年6月4日14:23
  • 2
    非常相似:如何使用正则表达式验证电子邮件地址? 评论 2022年2月16日23:18
  • 我必须承认,我不明白为什么在你无法预测用户是否使用有效字符创建了一个基本类型时,会有很多验证。只需勾选@,开始时至少一个点就足够了。 评论 2022年8月23日10:56

79个答案79

重置为默认值
6619

使用正则表达式可能是用JavaScript验证电子邮件地址的最佳方法。在JSFiddle上查看一系列测试取自.

const validateEmail=(电子邮件)=>{return字符串(电子邮件).to下壳体().匹配(/^(([^<>()[\]\\.,;:\s@“]+(\.[^<>()[\]\\.,;:\s@”]+)*)|。(“.+”)@((\[[0-9]{1,3}\.[0-9]}1,3}\.[0-9]{1,3{\.[0~9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);};

下面是接受unicode的正则表达式的示例。

常数=/^(([^<>()[\]\.,;:\s@\“]+(\.[^<>()[\]\.,;:\s@\”]+)*)|(“.+\”))@(([^<<()[\\]\.;:\s@\“]+\.)+[^<>()[\]\.,;:\s@\”]{2,})$/i;

请记住,不应该只依赖JavaScript验证,因为JavaScript很容易被客户端禁用。此外,在服务器端进行验证也很重要。

以下代码片段是JavaScript在客户端验证电子邮件地址的示例。

const validateEmail=(电子邮件)=>{返回email.match(/^(([^<>()[\]\\.,;:\s@\“]+(\.[^<>()[\]\\.,;:\s@\”]+)*)|(“.+\”))@((\[[0-9]{1,3}\.[0-9]}1,3}\.[0-9]{1,3{\\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,})$/);};常量验证=()=>{const$result=$(“#result”);const email=$('#email').val();$result.text(“”);if(验证电子邮件(电子邮件)){$result.text(电子邮件+“有效”);$result.css('color','green');}其他{$result.text(电子邮件+“无效。”);$result.css('color','red');}返回false;}$('#email').on('input',验证);
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js“></script>输入电子邮件地址<input id=“email”type=“email“><p id=“result”></p>

12
  • 722
    此正则表达式消除了有效的正在使用的电子邮件。请勿使用。谷歌搜索“RFC822”或“RFC2822”以获得合适的正则表达式。 评论 2010年9月8日2:34
  • 74
    这甚至不接受RFC 822中的示例。一些简单的情况下,它与\@[电子邮件保护],a(b)@c.com。有关更多信息,请参阅RFC。这里的正则表达式不会拒绝任何有效地址[^@]+@[^@]+\。[^@]+并防止常见错误。
    – 弗鲁
    评论 2012年10月26日6:32
  • 233
    您无法验证电子邮件地址,句点。唯一可以验证电子邮件地址的人是电子邮件地址的提供者。例如,此答案表示以下电子邮件地址:%[电子邮件保护],“%2”@gmail.com,“a..b”@gmali.com,“a_b”@gmail.com,[电子邮件保护],[电子邮件保护],[电子邮件保护]都是有效的,但Gmail永远不会允许这些电子邮件地址中的任何一个。您应该通过接受电子邮件地址并向该电子邮件地址发送电子邮件消息来完成此操作,其中包含用户必须访问以确认有效性的代码/链接。 评论 2014年2月1日8:49
  • 22
    @KevinFegan让我们现实一点:您不会使用JavaScript来确认电子邮件是否真实。我认为当用户注册时,这种验证是完全合理的。您可能不想麻烦地将验证电子邮件发送到不可能存在的地址。有些人还可能有出站电子邮件限制,因此值得向其发送电子邮件电子邮件@localhost,我没有电子邮件或任何其他有趣的用户输入。
    – 未定义
    评论 2021年7月16日23:02
  • 1
    @凯文·费根你不能验证一个电子邮件地址,但你可以识别出明显无效的地址。基本上是任何可以阻止发送邮件服务器发送邮件的东西。 评论 2021年8月16日6:35
1355

我稍微修改了一下杰蒙的回答对于希望以以下形式进行真正简单验证的人:

[电子邮件保护]

正则表达式:

/^\S+@\S+\。\S公司+$/

要防止匹配多个@符号:

/^[^\s@]+@[^\s@@]+\。[^\s@]+$/

以上正则表达式匹配整个字符串,删除前导和^和尾随$如果您想匹配字符串中的任何位置。下面的示例匹配在任何地方在字符串中。

如果你确实想匹配整个sring,你可能想修剪()首先是字符串。

JavaScript函数示例:

功能验证电子邮件(电子邮件){var re=/\S+@\S+\。\S+/;返回重新测试(电子邮件);}console.log(validateEmail(我的电子邮件是[电子邮件保护]')); // 真的console.log(validateEmail(我的电子邮件是anystring任意字符串.任何');//

8
  • 122
    你可以实现一个20倍长的东西,这可能会给一些用户带来问题,并且在未来可能无效,或者你可以使用ImmortalFirefly的版本,以确保他们至少会努力使它看起来真实。根据您的应用程序,可能更容易遇到某人因为您不接受他们非常规的电子邮件而生气,而不是那些通过输入不存在的电子邮件地址而导致问题的人(他们可以通过输入100%有效的RFC2822电子邮件地址,但使用未注册的用户名或域)。投票支持! 评论 2012年7月30日18:20
  • 134
    @仙人萤火虫,你提供的正则表达式实际上会匹配姓名@[电子邮件保护]。尝试将行粘贴到JavaScript控制台。我相信您的意图是只匹配整个文本,这需要文本“^”的开头和文本“$”的结尾操作符。我用的是/^[^\s@]+@[^\s@@]+\。[^\s@]+$/.test('名称@[电子邮件保护]') 评论 2012年8月9日14:58
  • 9
    电子邮件可以包含多个@签名(作为评论),电子邮件也不必包含句点。 评论 2021年10月6日14:08
  • 4
    @JoseG。对。例如。http://ai网址是某人的有效域,因此他们可以使用例如。一个@ai作为他们的电子邮件。 评论 2022年2月10日9:42
  • 1
    @蒂莫[^\s@]表示“既不是空白字符,也不是@".[xyz]表示x、y或z中的任意一个,以及[^xyz]指任何一个字符除了x、 y或z。\秒表示“任何空白字符”。\S公司表示“任何非空白字符”。
    – 杰拉比
    评论 2022年8月21日11:03
909

为了完整起见,这里有另一个符合RFC 2822的正则表达式

官方标准称为副本请求2822。它描述了有效电子邮件地址必须遵循的语法。您可以(但你不应该阅读)使用此正则表达式实现它:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zO-9!#$%&'*+/=?#_`{|}~-]+)*|“(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5b\x5d-\x7f]|\\[\x01-\ x09\x0b \x0c-\x0e-\x7f])*”)@(?:(?:a-z0-9](?:[a-z0-9-]*[a-zO-9])?\。)+[a-z0-9](?:[a-z0-19-]*[a-z0-29])|\[(?:(?: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-\x0f])+)\])

(…)如果我们省略了使用双引号和方括号的语法,则可以获得更实用的RFC 2822实现。它仍将匹配目前实际使用的99.99%的所有电子邮件地址。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zO-9!#$%&'*+/=??^_'{|}~-]+)*@(?:[a-z0-19](?:[a-z0-9-]*[a-z0-29])?\)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

您可以做的进一步更改是允许任何两个字母的国家代码顶级域,并且只允许特定的通用顶级域。此正则表达式过滤伪电子邮件地址,如[电子邮件保护].你将需要在添加新的顶级域时对其进行更新.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zO-9!#$%&'*+/=??^_'{|}~-]+)*@(?:[a-z0-19](?:[a-z0-9-]*[a-z0-29])?\)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

因此,即使在遵循官方标准的情况下,仍然需要权衡取舍。不要盲目地从在线图书馆或论坛复制正则表达式。始终在自己的数据和应用程序上测试它们。

Emphasis矿

5
  • 111
    注:“实际使用中今天“在200x年编写代码时可能是有效的。代码可能会在特定年份之后继续使用。(如果我每个“meh”都有一毛钱,除了那些“我必须修复的”,没有人会使用4+字母TLD,我可以垄断世界铜镍市场;) 评论 2012年6月13日15:51
  • 6
    请注意,这无法捕获一些有效的电子邮件地址,如以下表情符号地址:mailoji.com网站 评论 2021年10月6日1:28
  • 11
    @如果有人在使用表情符号电子邮件,Toastrackenigma不值得订阅我的网站。就这么简单。 评论 2022年6月6日13:24
  • @克里斯蒂安·文森佐·特拉纳(Christian Vincenzo Traina)是最后一个拒绝我在.rocks域上的电子邮件地址的人。如果这阻止了我阅读你的时事通讯,那么我最好不要把《无知日报》放进我的收件箱,但阻止我使用这个域名的服务列表包括:全国公共交通系统、航空公司、医疗服务。。。 评论 2023年4月23日13:42
  • 2
    @最后一个是无法维护的。2009年以来顶级域名数量激增 评论 2023年4月23日23:18
534

哇,这里很复杂。如果您只想捕获最明显的语法错误,我会这样做:

^\S+@\S+$

它通常会捕获用户犯下的最明显错误,并确保表单基本正确,这就是JavaScript验证的意义所在。

编辑:我们还可以检查“”在电子邮件中使用

/^\S+@\S+\。\S公司+$/
5
  • 120
    +1由于发送电子邮件并查看发生的情况是验证电子邮件地址的唯一可靠方法,因此只需简单的正则表达式匹配即可。 评论 2012年7月19日7:14
  • 4
    但它不会接受“Mohit Atray”@gmail.com,因为它包含空格字符。也许我们应该只使用/^\S.*@\S+$/regex。 评论 2021年7月8日19:57
  • 1
    这仍然是无效的。只要正确转义(用双引号),本地部分中允许使用空格。 评论 2022年6月21日22:10
  • @RandalSchwartz你关于@之前的空格的评论是由mohit写的。
    – 蒂莫
    评论 2022年8月22日19:24
  • 如何添加{2,6}以确保句点后的字符串长度在2到6个字符之间?
    – 阿凡达
    评论 2023年8月30日4:06
376

当您决定使用正则表达式验证电子邮件时,您必须理解以下内容:这可能不是个好主意。一旦你接受了这一点,有许多实现可以让你走到一半,这篇文章很好地总结了它们。

然而,简而言之,要绝对、积极地确定用户输入的内容实际上是电子邮件,唯一的方法就是实际发送一封电子邮件,看看会发生什么。除此之外,一切都只是猜测。

1
  • 77
    @kommradHomer——“regex无效”地址几乎总是有效的,因为您用来验证电子邮件地址的任何regex几乎肯定是错误的,并且会排除有效的电子邮件地址。电子邮件地址是名称部件@域部件几乎什么都有,包括一个@,在name_part中有效;地址足球@[电子邮件保护]是合法的,尽管它必须作为foo公司\@bar@机器。。。。。一旦电子邮件到达域(例如“example.com”),该域就可以“本地”路由邮件,因此可以存在“奇怪”的用户名和主机名。 评论 2013年3月7日1:40
330

HTML5本身具有电子邮件验证功能。如果您的浏览器支持HTML5,则可以使用以下代码。

<表格><label>电子邮件地址<input type=“电子邮件”占位符=“[电子邮件保护]“必需></label><输入类型=“提交”></form>

jsFiddle公司链接

HTML5规范:

A类有效的电子邮件地址是与电子邮件生成以下ABNF,其字符集为Unicode。

电子邮件=1*(atext/“.”)“@”label*(“.”label)label=let dig[[ldh str]let dig];RFC 1034第3.5节将长度限制为63个字符atext=<如RFC 5322第3.2.3节中所定义>let-dig=<如RFC 1034第3.5节中所定义>ldh-str=<如RFC 1034第3.5节中所定义>

此要求是故意违反RFC 5322中定义了电子邮件地址的语法,该语法同时太严格(在“@”字符之前)、太模糊(在“#”字符之后)和太松散(允许注释、空格字符和大多数用户不熟悉的方式引用的字符串),在这里无法实际使用。

以下与JavaScript和Perl兼容的正则表达式是上述定义的实现。

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-z9-Z0-9-]{0,61}[a-zC-Z0-9]])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-z9-Z0-9]])?)*$/
6
  • 54
    这很好,但问题是它必须位于形式标记并由提交提交投入,不是每个人都有这样的奢侈。此外,您不能真正设计错误消息的样式。
    – 杰森
    评论 2011年11月12日0:08
  • 起初我发现这个答案很有用,但我尝试了一些无效的电子邮件地址,正则表达式说有有效的。。。举例说明:bar@域(缺少扩展名),A@b@[电子邮件保护](多个@)等(cfen.wikipedia.org/wiki/Email_address#示例). 我在这里找到了一个不错的正则表达式:电子邮件regex.com 评论 2021年10月22日15:30
  • 2
    @ThomasChampion倍数“@”有效。但第一点是正确的。
    – KNP公司
    评论 2021年12月6日18:26
  • 2
    @KNP倍数@仅当用户名部分中出现额外的“@”并用双引号括起来时才有效。自2013年以来,第二点(缺少扩展)似乎也不再有效(icann.org/en/annociations/details/…),但这要视情况而定,我想有人会认为扩展是可选的。最后,我选择模块地址来自joi:joi.dev/模块/地址/api/?v=4.1.0#emailisvalizemail-options验证我的应用程序中的电子邮件地址。 评论 2021年12月7日21:37
  • 1
    这是错误的,您可以从检查器更改标记并绕过验证。这应该只针对ux,但它本身还不够 评论 2023年12月14日11:19
211

我发现这是最好的解决方案:

/^[^\s@]+@[^\s@@]+\。[^\s@]+$/

它允许以下格式:

1[电子邮件保护]2[电子邮件保护]三。[电子邮件保护]4.[电子邮件保护]9.  #!$%&'*+-/=?^_`{}|[电子邮件保护]6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}|~.a“@example.org7.“”@example.org(引号之间的空格)8.üñiheissoyer@example.com(本地部分使用Unicode字符)9.üñîçøğé@üñîçøğé.com(域名部分为Unicode字符)10.Pelé@example.com(拉丁语)11.δОκⅢμt_@παρδε12我買@屋企.香港 (中文)13甲斐@黒川.日本 (日语)14.бебураáа@аик-ch-аПелсинами.рф(西里尔文)

它显然是多功能的,允许使用所有重要的国际字符,同时仍然执行基本的[电子邮件保护]格式。它会阻塞RFC在技术上允许的空间,但它们非常罕见,我很乐意这样做。

1
  • 这将通过电子邮件“asd@asd。。“.TLD不应该至少有2个字符,而不是一个点吗? 评论 2023年12月11日8:16
176

在现代浏览器中,您可以使用纯JavaScript和DOM公司:

函数validateEmail(值){var输入=document.createElement('input');input.type='电子邮件';input.required=真;input.value=值;return typeof input.checkValidity===“函数”?input.checkValidity():/\S+@\S+\。\S+/.测试(值);}

我把一个例子放在小提琴上http://jsfiddle.net/boldewyn/2b6d5/。结合功能检测和来自斯奎特尔的回答,它将您从正则表达式屠杀中解放出来,并且不会在旧浏览器上停滞不前。

13
  • 8
    这应该是公认的答案。让拥有在职正则表达式专家的浏览器供应商为电子邮件地址维护大量复杂的正则表达式。您的普通前端开发人员构建用于收集电子邮件的表单时,通常没有时间掌握冗长的正则表达式。是的,您必须依赖供应商提供的正则表达式,但如果您需要更复杂的东西,请在服务器上执行,或者发送实际的电子邮件并检查响应
    – 马特
    评论 2021年7月16日11:04
  • 这是一个近乎完美的解决方案。唯一需要添加的一点是检查空字段。HTML5“email”类型接受空字符串作为有效输入。 评论 2021年12月31日23:00
  • 4
    我可能会重复一遍,但你注意到了吗input.required=真;行? 评论 2022年1月30日13:18
  • 1
    同样值得考虑的是:它对未来的更改很健壮,因为它不硬编码实际的正则表达式。我喜欢这方面。 评论 2022年4月10日14:45
  • 2
    卡尔斯蒂芬说了什么。考虑一个内联网应用程序的web应用程序。浏览器拒绝电子邮件地址,如user@localhost比没用还糟糕。这将严重阻碍表格的正确填写。 评论 2022年9月19日23:20
95

JavaScript可以匹配正则表达式:

emailAddress.match(/some_regex/);

这里有一个RFC22协议电子邮件的正则表达式:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|“(?=[\x01-\x7f])[^”\\]|\\[\x01-\x7f])*“\x20*)*(?<角度><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|”(?=[\x01-\x7f])[^“\\]|\\[\x01-\x7f]”)*“)@(((?!-)[a-zA-Z\d\-]+(?<!-)\)+[a-zA-Z]{2,}|\[((?(?)<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:(?=[\x01-\x7f])[^\\[\]]|\\[\x01-\x7f])+)(?(角度)>)$
2
  • @加藤:它使用了一些不兼容的扩展,包括(?>停止回溯和(?<角度><)…(?(角度)>)避免提供冗长的|.
    – 莱伊-
    评论 2014年3月9日20:05
  • 1
    这个比赛方法返回一个数组测试返回布尔值的方法更适合这种情况。 评论 2020年11月7日20:43
92

所有电子邮件地址都包含“at”(即@)符号。测试必要条件:

email.includes(“@”)

或者,如果您需要支持IE/更早的浏览器:

email.indexOf('@')>0

不要为更复杂的事情操心。即使你能完全确定一封电子邮件在RFC语法上是否有效,也不能告诉你它是否属于提供它的人。这才是真正重要的。

要进行测试,请发送验证消息。

5
  • 23
    如果有多个“@”符号怎么办?其他限制符号?无法信任此验证。。。 评论 2015年4月26日10:14
  • @b是有效的电子邮件吗?
    – 阿拉文
    评论 2020年12月20日10:17
  • 4
    这比大多数人都要好,是的,你可以有多个@,但也可以是一封有效的电子邮件,比如“@”@mydomain.jskd或elldffs(这是@comment)@mydomail.kjfdij。两者都是语法有效的电子邮件 评论 2021年2月16日18:37
  • 2
    @是的,是的。 评论 2021年9月29日11:01
  • 2
    @iwazovsky如果你使用字符串级别的验证来确定你是否可以“信任”输入的电子邮件,那么你已经做错了。除了捕捉错误之外,使用它进行任何其他操作都是不可能的,大多数错误都不会被捕获,因为它们看起来可能仍然像一封有效的电子邮件。 评论 2022年1月20日0:38
87

根据RFC对电子邮件地址进行正确的验证不是用一行正则表达式就能实现的。我在PHP中找到的最佳解决方案的一篇文章是什么是有效的电子邮件地址?显然,它已经被移植到Java。我认为这个函数太复杂了,无法在JavaScript中移植和使用。JavaScript/node.js端口:https://www.npmjs.com/package/email-addresses网址.

一个好的做法是在客户端验证数据,但在服务器上仔细检查验证。记住这一点,您可以简单地检查字符串在客户端上是否看起来像有效的电子邮件地址,并在服务器上执行严格的检查。

下面是我用来检查字符串是否看起来像有效的邮件地址的JavaScript函数:

函数looksLikeMail(str){var lastAtPos=str.lastIndexOf(“@”);var lastDotPos=str.lastIndexOf('.');return(lastAtPos<lastDotPos&&lastAtPos>0&&str.indexOf(“@@”)==-1&&last DotPos>2&&(str.length-lastDopPos)>2);}

说明:

  • lastAtPos<lastDotPos:最后@应该在最后一个之前.自从@不能是服务器名称的一部分(据我所知)。

  • lastAtPos>0:在最后一个之前应该有一些内容(电子邮件用户名)@.

  • str.indexOf(“@@”)==-1:应该没有@@在地址中。即使@显示为电子邮件用户名中的最后一个字符,必须加引号"将介于两者之间@和最后一个@在地址中。

  • lastDotPos>2:例如,在最后一个点之前至少应有三个字符[电子邮件保护].

  • (str.length-lastDotPos)>2:最后一个点后面应该有足够的字符,以形成双字符域。我不确定括号是否必要。

0
85

这是正确的RFC822版本。

功能检查电子邮件(电子邮件地址){var sQtext=“[^\\x0d\\x22\\x5c\\x80-\\xff]”;var sDtext=“[^\\x0d\\x5b-\\x5d\\x80-\\xff]”;var sAtom=“[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x40\\x5b-\\x5d\\x7f-\\xff]+”;var sQuotedPair='\\x5c[\\x00-\\x7f]';var sDomainLiteral='\\x5b('+sDtext+'|'+sQuotedPair+')*\\x5d';var sQuotedString='\\x22('+sQtext+'|'+sQuoted对+')*\\x22';var sDomain_ref=sAtom;var sSubDomain='('+sDomain_ref+'|'+sDomainLiteral+')';var sWord='('+sAtom+'|'+sQuotedString+')';var sDomain=sSubDomain+'(\\x2e'+sSubDomino+')*';var sLocalPart=sWord+'(\\x2e'+sWord+’)*';var sAddrSpec=sLocalPart+'\\x40'+sDomain;//完成RFC822电子邮件地址规范var sValidEmail=“^”+sAddrSpec+“$”;//作为整个字符串var reValidEmail=新RegExp(sValidEmail);return reValidEmail.test(emailAddress);}
6
81

这是从http://codesnippes.joyent.com/posts/show/1917

电子邮件=$('email');过滤器=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9-])+\。)+([a-zA-Z0-9]{2,4})+$/;if(filter.test(email.value)){//耶!有效的返回true;}其他的{返回false;}
0
75

这样做:

^([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9;#$%&'*+\/=??^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-z-a-Z0-9])?\)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)$

它基于副本请求2822

测试地点:https://regex101.com/r/857lzc/1

通常在数据库中存储电子邮件地址时,我会将它们改为小写,实际上,regex通常可以标记为不区分大小写。在这些情况下,该长度略短:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zO-9!#$%&'*+/=??^_'{|}~-]+)*@(?:[a-z0-19](?:[a-z0-9-]*[a-z0-29])?\)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

下面是在JavaScript中使用它的一个示例(带有不区分大小写的标志最后)。

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zO-9!#$%&'*+/=?^ _`{|}~-]+)*@(?:[a-z0-19](?:[a-z0-9-]*[a-z0-29])?\)+[a-z0-9](?:[a-z0-19-]*[a-z0-29])$/i;console.log(emailCheck.test('[电子邮件保护]') );

注释:
从技术上讲,一些电子邮件可以在@引号内带有转义字符的符号(因此您的电子邮件用户可能会令人讨厌并包含以下内容@"..."只要是用引号写的)。从来没有人这样做过!它已经过时了。但是,它包含在真实的副本请求2822标准,此处省略。

附注2:电子邮件的开头(@符号之前)可以区分大小写(通过规范)。然而,拥有区分大小写电子邮件的任何人都可能习惯于有问题,实际上,不区分大小写是一个安全的假设。更多信息:电子邮件地址区分大小写吗?

更多信息:http://www.regular-expressions.info/email.html

2
53

我真的很期待能解决这个问题。所以我修改了上面的电子邮件验证正则表达式

  • 原件
    /^(([^<>()\[\]\\.,;:\s@“]+(\.[^<>()\[\]\\.,;:\s@”]+)*)|(“.+”))@((\[[0-9]{1,3}\.[0-9][1,3}\.[0-9]}1,3}\.[0-9]{1,3{])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,})$/

  • 被改进的
    /^(([^<>()\[\]\.,;:\s@\“]+(\.[^<>()\[\]\.,;:\s@\”]+)*)|(\“.+\”)@(([^<<()\.,,;\s@\“]+\.{0,1})+[^<>()\,;:\s@\”]{2,})$/

在中传递示例维基百科电子邮件地址.

你可以看到结果在这里.

在此处输入图像描述

0
38

只需检查输入的电子邮件地址是否有效或未使用HTML。

<input type=“email”/>

没有必要编写用于验证的函数。

1
35

您不应该使用正则表达式验证输入字符串来检查它是否是电子邮件。它太复杂了,不能涵盖所有的案例。

现在,由于您只能涵盖90%的案例,请写下以下内容:

功能是PossiblyValidEmail(txt){return txt.length>5&&txt.indexOf(“@”)>0;}

你可以改进它。例如,“aaa@”是有效的。但总的来说,你得到了要点。不要忘乎所以。。。简单的90%解决方案比无效的100%解决方案要好。

世界需要更简单的代码。。。

1
  • 27
    这允许输入如此多的无效电子邮件地址,这是无用的建议。 评论 2012年1月6日23:07
33

维基百科标准邮件语法:

https://en.wikipedia.org/wiki/Email_address#示例 https://fr.wikipedia.org/wiki/Adresse_%C3%A9electronique#语法_精确

功能:

功能有效邮件(mail){返回/^(([^<>()\[\]\.,;:\s@\“]+(\.[^<>()\[\]\.,;:\s@\”]+)*)|(\“.+\”)@(([^<<()\.,,;\s@\“]+\.{0,1})+([^<>()\.,;;:\s@“]{2,}|[\d\.]+)$/.test(邮件);}

有效电子邮件:

validMail('[电子邮件保护]')//返回truevalidMail('[电子邮件保护].')//返回truevalidMail('[电子邮件保护]')//返回truevalidMail('用户@localserver')//返回truevalidMail('[电子邮件保护]')//返回truevalidMail('用户+邮箱/[电子邮件保护]')//返回truevalidMail(“非常.(),:;<>[]\”。非常好\“very@@\\”very\“.unversal”@strange.example.com')//返回true有效邮件('!#$%\'*+-/=?^_`.{|}[电子邮件保护]')//返回truevalidMail('“()<>[]:,;@\\\”!#$%&\'-/=^_`{}|~.a“@example.org')//返回truevalidMail('“Abc@定义“@example.com')//返回truevalidMail(“Fred Bloggs”@example.com)//返回truevalidMail('“Joe.\\Blow”@example.com')//返回truevalidMail('Loíc.Accentué@voilá.fr')//返回truevalidMail('“”@example.org')//返回truevalidMail('user@[IPv6:2001:DB8::1]')//返回true

无效电子邮件:

validMail('Abc.example.com')//返回false有效邮件(AA@b@[电子邮件保护]')//返回false有效邮件('a“b(c)d,e:f;g<h>i[j\k][电子邮件保护]')//返回falsevalidMail('只是“不”[电子邮件保护]')//返回falsevalidMail('this is“not\[电子邮件保护]')//返回falsevalidMail(“仍然”不是\\[电子邮件保护]')//返回falsevalidMail('[电子邮件保护]')//返回falsevalidMail('[电子邮件保护]')//返回false

显示此测试:https://regex101.com/r/LHJ9gU/1

2
29

Regex更新!试试这个

让val='[电子邮件保护]';如果(/^[a-z0-9][a-zO-9-_\.]+@([a-z]|[a-z9-9]?[a-zo-9-]+[a-z0-19])\。[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/。测试(val)){console.log(“通过”);}

典型脚本版本完成

//export const emailValid=(val:string):boolean=>/^[a-z0-9][a-zO-9-_\.]+@([a-z]|[a-z9-9]?[a-z0-19-]+[a-z0-29])\。[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/。测试(val);

更多信息https://git.io/vhEfc

正则表达式测试用例

2
  • 我不认为这对世界上的大多数人都有用,也不认为这是许多客户的非普通受众。对于国际化用户名和域,它将失败。我在下面的回答使用URL接口来解决这个问题,该接口已经在大多数运行时中内置了支持。裁判:stackoverflow.com/a/72018404/965666
    – 吉蒙特
    评论 2022年7月26日1:08
  • 也许会使正则表达式不区分大小写。否则,它将使大写字符的电子邮件地址失败。 评论 2022年9月16日2:52
25

很难让电子邮件验证器100%正确。唯一正确的方法是向帐户发送测试电子邮件。也就是说,有一些基本的检查可以帮助确保你得到的东西是合理的。

需要改进的事项:

而不是新的注册Exp,只需尝试编写正则表达式就像这样:

if(注册测试(/@/))

其次,检查以确保在@签名,并确保在@s和句点。

21

这就是如何节点验证器是否:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-z9-Z0-9'?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d |25[0-5])\){3} (?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\])$/
20

不检查TLD是否存在的解决方案是不完整的。

几乎所有这些问题的答案都建议使用Regex验证电子邮件地址。我认为Regex只适合进行初步验证。似乎电子邮件地址的检查验证实际上是两个独立的问题:

1-电子邮件格式验证:确保电子邮件是否符合RFC 5322中电子邮件的格式和模式,以及TLD是否实际存在。可以找到所有有效TLD的列表在这里.

例如,尽管地址[电子邮件保护]将传递正则表达式,这不是有效的电子邮件,因为中央控制中心不是IANA的顶级域。

2-确保电子邮件确实存在:为此,唯一的选择向用户发送电子邮件.

17

在验证器函数中使用以下代码:

var emailID=document.forms[“formName”][“form element id”].value;atpos=emailID.indexOf(“@”);dotpos=电子邮件ID.lastIndexOf(“.”);if(atpos<1(dotpos-atpos<2)){警报(“请输入正确的电子邮件ID”)返回false;}

否则您可以使用jQuery(jQuery)。内部规则定义:

电子邮件Id:{必需:true,电子邮件:true}
0
15

与…对比喷射,这是一个复杂的解决方案,但它在正确验证电子邮件方面做得非常好:

功能是电子邮件(email){返回/^((([a-z]|\d|[!#\$%&'\*\-\/=\?\^_`{|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\_`{\|}~]|[\u000A0-\u D7FF \uF900-\u FDCF\u FDF0-\uFFEF])+)*)|((\x22)(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\ u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b \x0c-\x0d-\x7f)|[\u00A0-\uD7 FF\uF 900-\u FDCF\u FDF0-\ uFFEF]))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|[a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))。)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|([a-z]|[\u 00A0-\ uD7FF\uF900-\ uFDCF\ uFDF0-\uFFEF])([a-z]|\d |-|\.|_|~|[u00A0-\uD7 FF\uF 900-\u FDCF\u FDF0-\ uFFEF)*7FF\uF900-\uFDCF\uFDF0-\uFFEF]))$/i.test(电子邮件);}

这样使用:

如果(isEmail('[电子邮件保护]'){console.log('这是有效的电子邮件');}
0
15

var测试结果函数checkemail(){var str=文档.validation.emailcheck.valuevar过滤器=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w/]+\.)*\w[\w]{0,66})\。([a-z]{2,6}(?:\.[a-z]{2})?)$/if(filter.test(str))测试结果=真其他{警报(“请输入有效的电子邮件地址!”)测试结果=假}返回(测试结果)}函数checkbae(){if(document.layers ||document.getElementById||documnt.all)return支票邮件()其他的返回true}
<form name=“validation”onSubmit=“return checkbae()”>请输入有效的电子邮件地址:<br/><input type=“text”size=18 name=“emailcheck”><input type=“submit”value=“submit”></form>

0
14

我的知识正则表达式不是那么好。这就是为什么我首先用一个简单的正则表达式检查一般语法,然后用其他函数检查更具体的选项。这可能不是最好的技术解决方案,但这样我就更灵活、更快了。

我遇到的最常见的错误是空格(尤其是在开头和结尾),偶尔还会出现双点。

函数check_email(val){if(!val.match(/\S+@\S+\.\S+/)){//Jaymon'S/Squirtle的解//做点什么返回false;}if(val.indexOf('')=-1||val.indexOf('..')=-1){//做点什么返回false;}返回true;}检查电子邮件('检查@this.com'); // 返回false检查电子邮件('[电子邮件保护]'); // 返回false检查电子邮件('[电子邮件保护]'); // 返回false检查电子邮件('[电子邮件保护]'); // 返回true
0
13

这里有一个关于使用正则表达式验证电子邮件地址的非常好的讨论;"比较电子邮件地址验证正则表达式"

以下是当前的顶级表达式,与JavaScript兼容,以供参考:

/^[-a-z0-9~!$%^&*=+}{\'?]+(\.[-a-z0-9~)$%^&*=+{\'吗]+)*@([a-z0-9_][-a-z 0-9_]*(\.[-a-zO-9_]+)*.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}[0-9]{1,3}\.[0-9]{1,3C}\.[0-9])(:[0-9]}1,5})$/
1
  • 现在已经非常过时了。 评论 2021年9月3日19:02
12

Regex用于验证电子邮件地址

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zO-9!#$%&'*+/=??^_'{|}~-]+)*@(?:[a-z0-19](?:[a-z0-9-]*[a-z0-29])?\)+[a-z0-9](?:[a-z0-19-]*[a-z0-29])+
0
11

显然,就是这样:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\+\-\/\=\?\'^\`\\}\~]+@,([a-z0-9]{1}[a-zO-9\-]{0,62}[a-z0-9]})|[a-z])+[a-z]{2,6})|(\d{1,3}\.){3}\d{1.3}(\:\d{1.5})$/

取自http://fightingforlostcause.net/misc/2006/compare-email-regex.php2010年10月1日。

当然,这是在忽视国际化。

0
11

哇,有很多答案包含稍微不同的正则表达式。我试过很多次,都得到了不同的结果和各种不同的问题。

对于UI验证,我很擅长最基本的检查寻找@符号需要注意的是,我总是使用标准的“验证电子邮件”进行服务器端验证,其中包含用户确认其电子邮件地址的唯一链接。

if(email.indexOf('@')>0)

我特意选择了0,即使是从零开始的,因为它也可以确保@之前只有一个字符。

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.