多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
当前回答
我知道这个问题是关于正则表达式的,但我猜,在阅读这些解决方案的所有开发人员中,90%都在尝试验证浏览器中显示的HTML格式的电子邮件地址。
如果是这种情况,我建议查看新的HTML5<inputtype=“email”>表单元素:
HTML5:
<input type="email" required />
CSS 3:
input:required {
background-color: rgba(255, 0, 0, 0.2);
}
input:focus:invalid {
box-shadow: 0 0 1em red;
border-color: red;
}
input:focus:valid {
box-shadow: 0 0 1em green;
border-color: green;
}
它是在HTML5表单验证没有JS-JSFidle代码游乐场。
这有两个优点:
自动验证,无需定制解决方案:简单易实现没有JavaScript,如果禁用了JavaScript也不会出现问题没有服务器需要为此计算任何东西用户有即时反馈旧浏览器应自动回退到输入类型“文本”移动浏览器可以显示专用键盘(@-键盘)使用CSS 3,表单验证反馈非常简单
明显的缺点可能是缺少对旧浏览器的验证,但这会随着时间的推移而改变。比起这些疯狂的正则表达式杰作,我更喜欢这个。
另请参见:
没有JS的HTML5表单验证-JSFiddle-代码游乐场Web表单-深入HTML5。疯狂的一种形式SUMO上的HTML5表单验证
其他回答
如果您需要一个简单的表单来验证,可以使用https://regexr.com/3e48o
^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$
让r=新RegExp(String.raw`^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$`);//应该是真的console.log(r.test('name@domain.tld'));console.log(r.test('name@domain.co.tld'));console.log(r.test('name@domain.co'));//应为falseconsole.log(r.test('@domain.tld'));console.log(r.test('name@.tld'));console.log(r.test('name@domain.'));console.log(r.test('namedomain.tld'));console.log(r.test(“”));//现在基本的客户端验证已经完成,从服务器端发送一个令牌来验证用户是否有权访问电子邮件
根据RFC 2821和RFC 2822,电子邮件地址的本地部分可以使用以下任意ASCII字符:
大写和小写字母数字0到9字符!#$%&'*+-/=^_`{|}~字符“.”,前提是它不是本地部分中的第一个或最后一个字符。
比赛:
一个&d@somedomain.com一个*d@somedomain.com一个/d@somedomain.com
不匹配项:
.abc@somedomain.comabc.@somedomain.coma>b@somedomain.com
对于符合RFC 2821和2822的,可以使用:
^((([!#$%&'*+\-/=?^_`{|}~\w])|([!#$%&'*+\-/=?^_`{|}~\w][!#$%&'*+\-/=?^_`{|}~\.\w]{0,}[!#$%&'*+\-/=?^_`{|}~\w]))[@]\w+([-.]\w+)*\.\w+([-.]\w+)*)$
电子邮件-符合RFC 2821、2822
我也有类似的愿望:希望快速检查电子邮件地址中的语法,而不要过分使用电子邮件发送实用程序(邮件::RFC822::地址答案显然是正确的答案)。我同意这个(我是一个POSIX正则表达式的人,所以我通常不会使用PCRE中的\d等,因为它们让我看不清楚):
preg_match("_^[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*@[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?)*\$_", $adr)
这是RFC正确的,但它明确排除了过时的表单以及直接IP地址(IP地址和传统IP地址),而该实用程序的目标组中的某些人(主要是:在IRC上的#sendmail中打扰我们的人)通常不希望或不需要这些地址。
IDN(国际化域名)明确不在电子邮件范围内:地址如“foo@cäcilenchor bonn.de“必须写”foo@xn--ccilienchor-bonn-vnb.de而在网络上(这包括HTML中的mailto:links和这样的乐趣),只允许GUI向用户显示(并接受然后转换)这样的名称。
对于Angular2/Angular7,我使用以下模式:
emailPattern=“^[a-zA-Z0-9-_.+-]+@[a-zA-APP-GW-9-]+[.]+[a-zA-62-9-.]+(\\s)*”;私有createForm(){this.form=this.formBuilder.group({email:['',[Validators.required,Validators.pattern(this.emailPattern)]]});}
它还允许在结尾处添加额外的空间,在将其发送到后端之前,应该将其截断,但某些用户,特别是移动用户,很容易在结尾处错误地添加空间。
对我来说,检查电子邮件地址的正确方法是:
检查符号@是否存在,在它之前和之后是否有一些非@符号:/^[^@]+@[^@]+$/尝试用一些“激活码”向该地址发送电子邮件。当用户“激活”他/她的电子邮件地址时,我们将看到一切都是正确的。
当然,当用户键入一封“奇怪”的电子邮件时,您可以在前端显示一些警告或提示,以帮助他/她避免常见错误,如域名部分没有圆点或名称中没有空格而没有引号等。但您必须接受地址“hello@world“如果用户真的想要它。
此外,您必须记住,电子邮件地址标准过去和将来都会发展,因此您不能总是只键入一些“标准有效”的正则表达式。而且你必须记住,一些具体的互联网服务器可能会在一些常见标准的细节上失败,事实上,它们可以使用自己的“修改标准”。
所以,只需检查@,在前端提示用户,并在给定地址发送验证电子邮件。