我对regular expressions的了解并不是那么好 . 那's why I check the general syntax with a simple regular expression first and check more specific options with other functions afterwards. This may not be not the best technical solution, but this way I'方式更灵活,更快捷 .
let val = 'email@domain.com';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
console.log('passed');
}
function validateEmail(email) {
var re = /^(([^<>()\[\]\\.,;:\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,}))$/;
return re.test(String(email).toLowerCase());
}
以下是接受unicode的常规表达示例:
var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('some.body@domain.co.uk') );
Note : 从技术上讲,一些电子邮件可以在 @ 符号之前的部分中包含引号,并在引号内包含转义字符(因此,您的电子邮件用户可能会讨厌并且包含 @ 和 "..." 等内容,只要's written in quotes). NOBODY DOES THIS EVER! It'已经过时 . 但是,它包含在真实中RFC 2822标准,此处省略 .
30 回答
所有电子邮件地址都包含“at”(即@)符号 . 测试必要条件:
不要打扰任何更复杂的事情 . 即使您可以完美地确定电子邮件在RFC语法上是否有效,但这并不能告诉您它是否属于提供它的人 . 这才是真正重要的 .
要测试它,请发送验证消息 .
Wikipedia standard mail syntax :
https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte
Show this test : https://regex101.com/r/LHJ9gU/1
我稍微修改了Jaymon对那些想要以下列形式进行简单验证的人的答案:
anystring@anystring.anystring
正则表达式:
JavaScript函数示例:
在验证器函数中使用此代码:
否则你可以使用jQuery . 内部规则定义:
这是从http://codesnippets.joyent.com/posts/show/1917偷来的
这就是node-validator的作用:
有史以来最好的正则表达式,用RFC5322证实
[a-z0-9!#$%&'*+/=?^_
{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])+
您不应该使用正则表达式来验证输入字符串以检查它是否是电子邮件 . 这太复杂了,不会涵盖所有情况 .
既然你只能覆盖90%的案例,那就写下:
你可以改进它 . 例如,'aaa @'是有效的 . 但总的来说,你得到了要点 . 并且不要忘记......一个简单的90%解决方案比不起作用的100%解决方案更好 .
世界需要更简单的代码......
这是正确的RFC822版本 .
使用单行正则表达式无法实现符合RFC的电子邮件地址的正确验证 . 我在PHP中找到的最佳解决方案的文章是What is a valid email address? . 显然,它已被移植到Java . 我认为这个函数太复杂了,无法在JavaScript中移植和使用 . JavaScript / node.js端口:https://www.npmjs.com/package/email-addresses .
一个好的做法是在客户端验证您的数据,但要仔细检查服务器上的验证 . 考虑到这一点,您只需检查字符串是否看起来像客户端上的有效电子邮件地址,并对服务器执行严格检查 .
这是我用来检查字符串是否看起来像有效邮件地址的JavaScript函数:
说明:
lastAtPos < lastDotPos
:最后@
应该在最后.
之前,因为@
不能是服务器名称的一部分(据我所知) .lastAtPos > 0
:在最后@
之前应该有一些东西(电子邮件用户名) .str.indexOf('@@') == -1
:地址中不应该有@@
. 即使@
显示为电子邮件用户名中的最后一个字符,也必须引用它,以便"
位于@
和地址中的最后一个@
之间 .lastDotPos > 2
:最后一个点之前应该至少有三个字符,例如a@b.com
.(str.length - lastDotPos) > 2
:在最后一个点之后应该有足够的字符来形成双字符域 . 我不确定括号是否必要 .HTML5本身有电子邮件验证 . 如果您的浏览器支持HTML5,那么您可以使用以下代码 .
jsFiddle链接
来自HTML5 spec:
Microsoft在ASP.NET MVC中提供的正则表达式是
我在这里发布以防它有缺陷 - 尽管它总是满足我的需求 .
我真的很期待解决这个问题 . 所以我上面修改了电子邮件验证正则表达
原创
/^(([^<>()\[\]\\.,;:\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,})$/
传递Wikipedia Email Address中的示例 .
你可以在here看到结果 .
很难让电子邮件验证工具100%正确 . 使其正确的唯一真正方法是向该帐户发送测试电子邮件 . 也就是说,有一些基本的检查可以帮助确保你得到一些合理的东西 .
有些事要改进:
而不是新的
RegExp
,只需尝试像这样编写regexp
:其次,检查以确保
@
符号后面有一个句点,并确保@
和句点之间有字符 .这是关于使用正则表达式验证电子邮件地址的非常好的讨论; “Comparing E-mail Address Validating Regular Expressions”
这是当前的顶级表达式,即JavaScript兼容,供参考:
我发现这是最好的解决方案:
它允许以下格式:
它显然是多功能的,允许所有重要的国际角色,同时仍然执行基本的any@anything.anything格式 . 它将阻止RFC在技术上允许的空间,但它们非常罕见,我很乐意这样做 .
为了完整,here you have another RFC 2822 compliant regex
强调我的
哇,这里有很多复杂性 . 如果您只想捕获最明显的语法错误,我会做这样的事情:
它通常捕获用户做出的最明显的错误,并确保表单大部分是正确的,这就是JavaScript验证的全部内容 .
我对regular expressions的了解并不是那么好 . 那's why I check the general syntax with a simple regular expression first and check more specific options with other functions afterwards. This may not be not the best technical solution, but this way I'方式更灵活,更快捷 .
我遇到的最常见的错误是空格(特别是在开头和结尾),偶尔也会出现双点 .
只需使用HTML查看输入的电子邮件地址是否有效 .
没有必要编写用于验证的函数 .
正则表达式更新2018年!试试这个
typscript版本完成
更多信息https://git.io/vhEfc
显然,就是这样:
摘自10月1日的http://fightingforalostcause.net/misc/2006/compare-email-regex.php .
但是,当然,这忽视了国际化 .
使用regular expressions可能是最好的方法 . 你可以看到一堆测试here(取自chromium)
以下是接受unicode的常规表达示例:
但请记住,不应该只依赖JavaScript验证 . 可以轻松禁用JavaScript . 这也应该在服务器端验证 .
以下是上述操作的示例:
JavaScript可以匹配正则表达式:
这是电子邮件的RFC22正则表达式:
不检查TLD是否存在的解决方案不完整 .
几乎所有这些问题的答案都建议使用Regex来验证电子邮件地址 . 我认为Regex只适用于初步验证 . 似乎电子邮件地址的检查验证实际上是两个独立的问题:
1- Validation of email format: 确保电子邮件符合RFC 5322中电子邮件的格式和模式,以及TLD是否确实存在 . 可以找到所有有效TLD的列表here .
例如,虽然地址
example@example.ccc
将通过正则表达式,但它不是有效的电子邮件,因为ccc
不是IANA的顶级域名 .2- Making sure the email actually exists: 为此, the only option 是to send the users an email .
在现代浏览器中,您可以使用纯JavaScript和DOM构建@Sushil的答案:
我把小提琴中的一个例子放在一起http://jsfiddle.net/boldewyn/2b6d5/ . 结合特征检测和Squirtle's Answer的简单验证,它使您摆脱了正则表达式屠杀和不会在旧浏览器上出现问题 .
做这个:
为什么? It's based on RFC 2822 ,这是一个标准的所有电子邮件地址必须坚持 .
通常,当在数据库中存储电子邮件地址时,我将它们设置为小写,并且在实践中,正则表达式通常可以标记为不区分大小写 . 在这些情况下,这会略短:
以下是在JavaScript中使用它的示例(最后使用不区分大小写的标志
i
) .Note :
从技术上讲,一些电子邮件可以在
@
符号之前的部分中包含引号,并在引号内包含转义字符(因此,您的电子邮件用户可能会讨厌并且包含@
和"..."
等内容,只要's written in quotes). NOBODY DOES THIS EVER! It'已经过时 . 但是,它包含在真实中RFC 2822标准,此处省略 .更多信息:http://www.regular-expressions.info/email.html
与squirtle相比,这是一个复杂的解决方案,但它可以很好地正确验证电子邮件:
使用如下:
你决定使用正则表达式来验证电子邮件,你需要了解的第二件事:It's probably not a good idea . 一旦你接受了这个,那里有很多实现可以让你到达那里,this article sums them up nicely.
简而言之,唯一的方法是绝对,确定用户输入的内容实际上是电子邮件,实际上是发送电子邮件并查看会发生什么 . 除此之外,这一切都只是猜测 .