What is the simplest regular expression to validate emails to not accept them blindly?
当用户在我的网站上创建一个帐户时,我想对电子邮件进行服务器验证,使其不接受每一个输入。
我将发送一个确认,以进行握手验证。
我在寻找一些简单的东西,不是最好的,但不是太简单,不能验证任何东西。我不知道限制必须在哪里,因为任何正则表达式都不会进行正确的验证,因为用正则表达式都不可能进行验证。
我试图限制正则表达式固有的sintax和视觉复杂性,因为在这种情况下,任何一个都是正确的。
我可以用什么regexp来做这个?
- 认为"最简单的"和"最好的"一样主观,这条线有着丰富的正则表达式,但如果你这么认为的话…耸肩
- 如果您执行regex验证,为什么要将表达式限制为简单的形式?让我们使用一些好的东西,这不会对代码产生影响,从而提供更好的结果。
- 这个验证在您的应用程序中会在哪里?在岗位上?你在做什么消毒输入?
可以编写一个只接受符合标准的电子邮件地址的正则表达式。但是,有一些电子邮件地址没有严格遵守标准,但仍然有效。
下面是一些用于基本验证的简单正则表达式:
包含@字符:
号
包含@和后面的某个句点:
在@之前、之前和之后至少有一个字符:
。
只有一个@,@前、句点前和句点后至少有一个字符:
用户amoebaman17建议修改以消除空白:
1
| ^[^@\s]+@[^@\s]+\.[^@\s]+$ |
。
- 如果你仔细看看是什么与RFC 6531,如果你仔细看看RFC 3696,你可能会得出结论,唯一的方法来验证电子邮件是发送确认电子邮件。我认为在电子邮件地址上使用regex的真正重点应该是帮助用户防止输入错误,这就是这种简单的regex发挥作用的地方。
- 完美,@amoebaman17.regex可以验证电子邮件地址的格式,但不能验证电子邮件地址的内容。也就是说,您的格式完全有效。发送电子邮件是验证内容的唯一方法。
- 不会在[email protected]上工作吗?
- 为了防止字符串以句点结尾,我做了如下修改:^[^@s]+@[^@s]+.[^@.s].+$
- 这将匹配无效的地址。任何regex都会,但这一个会匹配常见的拼写错误,如[email protected](注意双点)。请提供一个更好的示例。
- 它应该是一个最大限度的简单,非常粗糙的过滤器,我不明白为什么双倍的周期要比其他所有类似的复杂成本来覆盖它们的错误都有特权。
- + 1。不管怎样,这是一个主观问题,这很简单。
- 是的,如果您不想使用完全验证regex,这是一个很好的简单近似值
- 这是一个非常复杂的问题,但是如果你认为一个更好的正则表达式的分数微秒成本是不值得的…耸耸肩再次收回投票,享受吧。
- 嘿,谢谢。这不是小数微秒,而是表达式的视觉/语法复杂性;我的印象是,操作人员希望将其最小化。
- +1试图通过regex"验证"电子邮件地址是一件愚蠢的事情。这可以捕获最简单的MIS类型;其余的可以通过尝试发送邮件找到。上面还允许unicode(->punycode)域,其中大多数"聪明"的正则表达式都会失败。
- +因为它是"简单的东西,不是最好的"
- 我很挑剔,但域部分不需要一个点。这个看起来很简单,但并不比没有测试好。它并不比字符串搜索@字符好多少。检查JP的答案是否正确。
- 编辑删除点,因为是的,你可以在一个TLD上有一个电子邮件地址,我模糊地感觉到"最简单"的回答(再一次,@frunsi,他没有要求好,他要求简单,和JP不同,我回答的问题)可能会抛出很多误报,但不应该抛出任何误报。
- 我个人会把这个扩展到^s+@s+.s+$
- @相关性:这将抛出错误的否定,因为任何DNS名称,包括一个裸露的TLD,都可以在其上有电子邮件地址。
- @混乱有趣。根据这一点,裸TLD被icann icann.org/news/announcement-2013-08-30-en禁止。你能提供任何真实世界中使用DNS名称进行电子邮件的例子吗?
- @relequestual:试着去阅读那些关于漏洞的文章,而不是你喜欢的解释,参见tools.ietf.org/html/rfc7085第2.3节。
- 现在已经很老了,但是您可以考虑字符串的开始/结束,而不是像这样的行的开始/结束\A\S+@\S+\z。
- @brad:^和$表示字符串的开始和结束,除非您特别使用多行选项。
我认为,对amoebaman17表达式的这个小小的调整应该会使地址从一个点开始/结束,同时也会使相邻的多个点停止。在消除一个共同问题的同时尽量不让它再次复杂化。
1
| (?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$) |
它似乎在工作(但我不是雷杰克斯珀特)。修复了我对用户的问题从以句点结尾的句子中复制和粘贴电子邮件地址。
这是我的新电子邮件地址[email protected]。
- 在@
- 根据此regex,alert('hello')@hello.com有效。看起来不太好。
^[A-ZA-Z0-9+-]+@[A-ZA-Z0-9-]+[A-ZA-Z0-9-.]+$
选你的。
这是一个符合RFC2822第3.4.1节…
1
| (?:[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])+)\]) |
。
以防你好奇。:)
- 请注意,现在任何人看到这一点:这不符合RFC2822。
- 这也不简单。
- 它还将阻止有效电子邮件地址的主机。尤其是使用国际字符/语言的。