提问



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

最佳参考


使用正则表达式可能是最好的方法。你可以在这里看到一堆测试(取自铬)[71] [72] [73]


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;


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


以下是上述行动的一个例子:




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(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 2822的正则表达式[74]



  官方标准称为RFC 2822.它描述了有效电子邮件地址必须遵守的语法。你可以(但你不应该—继续阅读)用这个正则表达式实现它:[75] [76]

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

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

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

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



强调我的

其它参考1


我已经略微修改了Jaymon对那些希望以下列形式进行简单验证的人的答案:



  anystring@anystring.anystring



正则表达式:


/\S+@\S+\.\S+/


JavaScript函数示例:


function validateEmail(email) 
{
    var re = /\S+@\S+\.\S+/;
    return re.test(email);
}

其它参考2


你决定使用正则表达式来验证电子邮件,你需要了解的第二件事:这可能不是一个好主意。一旦你接受了这个,有很多实现可以让你到达那里,本文很好地总结了它们。[77] [78]


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

其它参考3


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


\S+@\S+


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

其它参考4


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


<form><input type="email" placeholder="me@example.com">
    <input type="submit">
</form>


jsFiddle链接[79]


来自HTML5规范:[80]



  有效电子邮件地址是与以下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定义了同时过于严格(在@字符之前),过于模糊(在@字符之后)的电子邮件地址的语法,并且过于宽松(允许注释) ,空白字符,以及大多数用户不熟悉的方式引用的字符串)在这里具有实际用途。[81]

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


/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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])?)*$/


其它参考5


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


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


它允许以下格式:


1.  prettyandsimple@example.com
2.  very.common@example.com
3.  disposable.style.email.with+symbol@example.com
4.  other.email-with-dash@example.com
9.  #!$%&'*+-/=?^_`{}|~@example.org
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)


它显然是多功能的,允许所有重要的国际角色,同时仍然强制执行基本的东西@anything.anything格式。它将阻止RFC技术上允许的空间,但它们是如此罕见,我很高兴这样做。

其它参考6


在现代浏览器中,你可以建立在@Sushil的纯JavaScript和DOM的答案之上:[82]


function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.value = value;

  return typeof input.checkValidity == 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}


我已经在小提琴http://jsfiddle.net/boldewyn/2b6d5/中组合了一个例子。结合特征检测和Squirtle的答案中的简单验证,它让你摆脱正规表达式大屠杀而不是老浏览器上的bork。[83]

其它参考7


JavaScript可以匹配正则表达式:


emailAddress.match( / some_regex /);


这是电子邮件的RFC22正则表达式:[85]


^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\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])+)\])(?(angle)>)$

其它参考8


这是正确的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);
}

其它参考9


使用单行正则表达式无法实现符合RFC的电子邮件地址的正确验证。我在PHP中找到的最佳解决方案的文章是什么是有效的电子邮件地址?。显然,它已被移植到Java。我认为该功能太复杂,无法移植和使用的JavaScript。[86]


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


这是我用来检查字符串是否看起来像有效邮件地址的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:最后@应该在最后.之前,因为@不能成为服务器名称的一部分(据我所知)。

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

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

  • lastDotPos > 2:在最后一个点之前应该至少有三个字符,例如a@b.com

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


其它参考10


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


email.indexOf("@") > 0


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


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

其它参考11


这是从http://codesnippets.joyent.com/posts/show/1917 [87]中偷来的


email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

其它参考12


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



  • 原,点击
    /^(([^<>()\[\]\\.,;:\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,})$/



通过维基百科电子邮件地址中的示例。[88]


你可以在这里看到结果。[89]


[90]

其它参考13


做这个:


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


为什么?它基于RFC 2822,这是一个标准的所有电子邮件地址必须坚持。[91]


通常,当在数据库中存储电子邮件地址时,我将它们设置为小写,并且在实践中,正则表达式通常可以标记为不区分大小写。在这些情况下,这会略短:


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


这是一个在JavaScript中使用的示例(最后使用不区分大小写的标志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') );


注意:结果
从技术上讲,一些电子邮件可以在@符号之前的部分中包含引号,其中包含引号内的转义字符(因此,您的电子邮件用户可能会令人讨厌,并且包含@"..."之类的内容,只要它用引号写的。没有人这么做!它已经过时了。但是,它包含在真正的RFC 2822标准中,并在此省略。[92]


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

其它参考14


您不应该使用正则表达式来验证输入字符串以检查它是否是电子邮件。它太复杂并且不会涵盖所有情况。


既然你只能覆盖90%的案例,那就写下:


function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}


你可以改进它。例如,aaa @有效。但总的来说,你得到了要点。不要忘记......一个简单的90%解决方案比100%不起作用的解决方案更好。


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

其它参考15


这就是节点验证器的作用:[94]


/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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])\]))$/

其它参考16


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


<input type="email"/>


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

其它参考17


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


有些事要改进:


而不是新RegExp,只需尝试像这样写regexp:


if (reg.test(/@/))


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

其它参考18


显然,就是这样:


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


摘自10月1日http://fightingforalostcause.net/misc/2006/compare-email-regex.php10。[95]


但是,当然,这忽视了国际化。

其它参考19


与 squirtle 相比,这是一个复杂的解决方案,但它可以很好地验证电子邮件:


function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\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-\uD7FF\uF900-\uFDCF\uFDF0-\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]|\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]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 


像这样使用:




if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }

其它参考20


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


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。内部规则定义:[96]


eMailId: {
    required: true,
    email: true
}

其它参考21


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



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


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


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


2-确保电子邮件确实存在:为此,唯一选项是向用户发送电子邮件。[98]

其它参考22


有史以来最好的正则表达式,用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])+

其它参考23


这是关于使用正则表达式验证电子邮件地址的非常好的讨论; 比较电子邮件地址验证正则表达式[99]


以下是当前的顶级表达式,即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

其它参考24


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


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


function check_email(val){
    if(!val.match(/\S+@\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('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true

其它参考25


<form name="validation" onSubmit="return checkbae()">
    Please input a valid email address:<br />

    <input type="text" size=18 name="emailcheck">
    <input type="submit" value="Submit">
</form>

<script language="JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>

其它参考26


Microsoft MVC在ASP.NET MVC中提供的正则表达式[101]


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


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

其它参考27


维基百科标准邮件语法:


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


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

// VALID MAILS

validMail('Abc@example.com') // Return true
validMail('Abc@example.com.') // Return true
validMail('Abc@10.42.0.1') // Return true
validMail('user@localserver') // Return true
validMail('Abc.123@example.com') // Return true
validMail('user+mailbox/department=shipping@example.com') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}~@example.com') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"Abc@def"@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('user@[IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

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


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

其它参考28


Sectrean的解决方案效果很好,但它失败了。所以我添加了一些逃脱:[105]


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(email); 
}