javascript - js email regex




如何在JavaScript中验证电子邮件地址? (20)

如何在JavaScript中验证电子邮件地址?


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

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

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

例如,虽然地址[email protected]将通过正则表达式,但它不是有效的电子邮件,因为ccc它不是IANA的顶级域名。

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


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

<form><input type="email" placeholder="[email protected]">
    <input type="submit">
</form>

jsFiddle链接

来自HTML5规范

有效的电子邮件地址是与以下ABNF的email生成相匹配的字符串,其字符集为Unicode。

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

此要求是对RFC 5322的故意违反 ,RFC 5322定义了同时过于严格(在“@”字符之前),过于模糊(在“@”字符之后)的电子邮件地址的语法,并且过于宽松(允许注释) ,空白字符和大多数用户不熟悉的引用字符串)在这里具有实际用途。

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

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

维基百科标准邮件语法:

https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte

function validMail(mail)
{
    return /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()\.,;\[email protected]\"]+\.{0,1})+([^<>()\.,;:\[email protected]\"]{2,}|[\d\.]+))$/.test(mail);
}

// VALID MAILS

validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('user+mailbox/[email protected]') // Return true
validMail('"very.(),:;<>[]\".VERY.\"[email protected]\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email protected]') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"[email protected]"@example.com') // Return true
validMail('"Fred Bloggs"@example.com') // Return true
validMail('"Joe.\\Blow"@example.com') // Return true
validMail('Loïc.Accentué@voilà.fr') // Return true
validMail('" "@example.org') // Return true
validMail('[email protected][IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

validMail('Abc.example.com') // Return false
validMail('[email protected]@[email protected]') // Return false
validMail('a"b(c)d,e:f;g<h>i[j\k][email protected]') // Return false
validMail('just"not"[email protected]') // Return false
validMail('this is"not\[email protected]') // Return false
validMail('this\ still\"not\\[email protected]') // Return false
validMail('[email protected]') // Return false
validMail('[email protected]') // Return false

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


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

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

(?:[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])+)\])

(...)如果我们使用双引号和方括号省略语法,我们会得到更实际的RFC 2822实现。 它仍将匹配当前实际使用的99.99%的电子邮件地址。

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

您可以进行的进一步更改是允许任何双字母国家/地区代码顶级域,并且只允许特定的通用顶级域。 此正则表达式过滤虚拟电子邮件地址,如[email protected] 。 您需要在添加新的顶级域时更新它

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

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

强调我的


使用正则表达式可能是最好的方法。 你可以here看到一堆测试(取自chromium

function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\[email protected]"]+(\.[^<>()\[\]\\.,;:\[email protected]"]+)*)|(".+"))@((\[[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 = /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\[email protected]\"]+\.)+[^<>()[\]\.,;:\[email protected]\"]{2,})$/i;

但请记住,不应该只依赖JavaScript验证。 可以轻松禁用JavaScript。 这也应该在服务器端验证。

以下是上述操作的示例:

function validateEmail(email) {
  var re = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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(email);
}

function validate() {
  var $result = $("#result");
  var email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").bind("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>


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

一个好的做法是在客户端验证您的数据,但要仔细检查服务器上的验证。 考虑到这一点,您只需检查字符串是否在客户端上看起来像一个有效的电子邮件地址,并对服务器执行严格检查。

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

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

说明:

  • lastAtPos < lastDotPos :Last @应该在last之前. 因为@不能成为服务器名称的一部分(据我所知)。

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

  • str.indexOf('@@') == -1 :地址中不应该有@@ 。 即使@作为电子邮件用户名中的最后一个字符出现,也必须引用它"将在@和地址中的最后一个@之间。

  • lastDotPos > 2 :最后一个点之前应该至少有三个字符,例如[email protected]

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


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

<input type="email"/>

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


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

\[email protected]\S+

它通常捕获用户做出的最明显的错误,并确保表单大部分是正确的,这就是JavaScript验证的全部内容。


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

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

否则你可以使用jQuery。内部规则定义:

eMailId: {
    required: true,
    email: true
}

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

有些事要改进:

而不是新的RegExp ,只需尝试像这样编写正则regexp

if (reg.test(/@/))

其次,检查以确保@符号后面有一个句点,并确保@和句点之间有字符。


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

/^[^\[email protected]][email protected][^\[email protected]]+\.[^\[email protected]]+$/

它允许以下格式:

1.  [email protected]
2.  [email protected]
3.  [email protected]
4.  [email protected]
9.  #!$%&'*+-/=?^_`{}|[email protected]
6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

它显然是多功能的,允许所有重要的国际角色,同时仍然执行基本的[email protected]格式。 它将阻止RFC在技术上允许的空间,但它们非常罕见,我很乐意这样做。


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

传递维基百科电子邮件地址中的示例。

你可以在here看到结果。


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

email.indexOf("@") > 0

不要打扰任何更复杂的事情。 即使您可以完美地确定电子邮件在RFC语法上是否有效,但这并不能告诉您它是否属于提供它的人。 这才是真正重要的。

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



正则表达式更新2018年! 试试这个

let val = '[email protected]';
if(/^[a-z0-9][a-z0-9-_\.][email protected]([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');
}

typscript版本完成

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.][email protected]([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

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


这是node-validator工作方式:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~][email protected](?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-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])\]))$/

这是正确的RFC822版本。

function checkEmail(emailAddress) {
  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\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

Microsoft MVCASP.NET MVC中提供的正则表达式是

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

我在这里发布以防它有缺陷 - 尽管它总是满足我的需求。


我对正则表达式的了解并不是那么好。这就是为什么我先用简单的正则表达式检查一般语法,然后用其他函数检查更多特定选项。这可能不是最好的技术解决方案,但这种方式我更灵活,更快。

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

function check_email(val){
    if(!val.match(/\[email protected]\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('[email protected]'); // Returns false
check_email('[email protected]'); // Returns false
check_email(' [email protected]'); // Returns false
check_email('[email protected]'); // Returns true

这是关于使用正则表达式验证电子邮件地址的非常好的讨论; “ http://fightingforalostcause.net/misc/2006/compare-email-regex.php

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

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-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,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i




email-validation