如何在 JavaScript 中验证电子邮件地址?
-
09-06-2019 - |
题
如何在 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(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").on("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 的正则表达式
官方标准被称为 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])?
您可以进行的进一步更改是允许任何两个字母的国家/地区代码顶级域,并且仅允许特定的通用顶级域。 这个正则表达式过滤虚拟电子邮件地址,例如
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
因此,即使遵循官方标准,仍然需要做出权衡。 不要盲目地从在线图书馆或论坛复制正则表达式。始终使用您自己的数据和您自己的应用程序来测试它们。
强调我的
对于那些想要真正简单验证的人,我稍微修改了 Jaymon 的答案,其形式为:
任意字符串@任意字符串.任意字符串
正则表达式:
/\S+@\S+\.\S+/
JavaScript 函数示例:
function validateEmail(email)
{
var re = /\S+@\S+\.\S+/;
return re.test(email);
}
哇,这里有很多复杂性。如果您只想捕获最明显的语法错误,我会这样做:
^\S+@\S+$
它通常会捕获用户犯下的最明显的错误,并确保表单基本正确,这就是 JavaScript 验证的全部内容。
当您决定使用正则表达式来验证电子邮件时,您必须了解一些事情: 这可能不是一个好主意. 。一旦你接受了这一点,就有很多实现可以让你成功一半, 这篇文章很好地总结了它们。
然而,简而言之,要绝对、肯定地确定用户输入的内容实际上是电子邮件的唯一方法是实际发送电子邮件并看看会发生什么。除此之外,一切都只是猜测。
HTML5 本身具有电子邮件验证功能。如果您的浏览器支持 HTML5,那么您可以使用以下代码。
<form><input type="email" placeholder="me@example.com" required>
<input type="submit">
</form>
jsFiddle 关联
来自 HTML5 规范:
A 合法的邮件地址 是一个匹配的字符串
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 的定义,它定义了电子邮件地址的语法,该语法同时过于严格(在“@”字符之前)、过于模糊(在“@”字符之后)和过于宽松(允许注释、空格字符和引用)字符串以大多数用户不熟悉的方式)在这里有实际用途。
以下与 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])?)*$/
我发现这是最好的解决方案:
/^[^\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)
它显然是多功能的,允许使用所有重要的国际字符,同时仍然强制执行基本的 everything@anything.anything 格式。它会阻塞 RFC 技术上允许的空间,但它们非常罕见,所以我很乐意这样做。
在现代浏览器中,您可以使用纯 JavaScript 和 @Sushil 的答案构建 DOM:
function validateEmail(value) {
var input = document.createElement('input');
input.type = 'email';
input.required = true;
input.value = value;
return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}
我在小提琴中整理了一个例子 http://jsfiddle.net/boldewyn/2b6d5/. 。结合特征检测和基本验证 杰尼龟的回答, ,它将您从正则表达式的屠杀中解放出来,并且不会在旧浏览器上感到厌烦。
JavaScript 可以匹配正则表达式:
emailAddress.match( / some_regex /);
这是一个 RFC22 电子邮件的正则表达式:
^((?>[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)>)$
这是正确的 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);
}
所有电子邮件地址都包含“at”(即@) 象征。测试必要条件:
email.indexOf("@") > 0
不要为任何更复杂的事情烦恼。即使您可以完全确定一封电子邮件在 RFC 语法上是否有效,也无法告诉您该电子邮件是否属于提供该电子邮件的人。这才是真正重要的。
要测试这一点,请发送一条验证消息。
使用单行正则表达式无法实现根据 RFC 正确验证电子邮件地址。我在 PHP 中找到的最佳解决方案的文章是 什么是有效的电子邮件地址?. 。显然,它已经被移植到了Java上。 我认为该函数太复杂,无法在 JavaScript 中移植和使用。 JavaScript/node.js 端口: https://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
: :最后的@
应该在最后一个之前.
自从@
不能是服务器名称的一部分(据我所知)。lastAtPos > 0
: :最后一个之前应该有一些东西(电子邮件用户名)@
.str.indexOf('@@') == -1
: :应该没有@@
在地址中。即使@
显示为电子邮件用户名中的最后一个字符,必须用引号引起来"
将在这之间@
和最后一个@
在地址中。lastDotPos > 2
: :例如,最后一个点之前至少应有三个字符a@b.com
.(str.length - lastDotPos) > 2
: :最后一个点之后应该有足够的字符来形成两个字符的域。我不确定括号是否必要。
这是被盗的 http://codesnippets.joyent.com/posts/show/1917
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;}
我真的很期待解决这个问题。所以我修改了上面的电子邮件验证正则表达式
原来的
/^(([^<>()\[\]\\.,;:\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,})$/
传递示例 维基百科电子邮件地址.
你可以看到结果 这里.
做这个:
[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, ,这是所有电子邮件地址都必须遵守的标准。我不确定你为什么要为“更简单”的事情烦恼......无论如何你都会复制并粘贴它;)
通常,在数据库中存储电子邮件地址时,我会将它们设为小写,并且在实践中,正则表达式通常可以标记为不区分大小写。在这些情况下,这会稍微短一些:
[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 标准,此处省略。
您不应使用正则表达式来验证输入字符串以检查它是否是电子邮件。它太复杂了,无法涵盖所有情况。
现在,由于您只能覆盖 90% 的情况,请编写如下内容:
function isPossiblyValidEmail(txt) {
return txt.length > 5 && txt.indexOf('@')>0;
}
你可以完善它。例如,“aaa@”是有效的。但总的来说,你明白了要点。并且不要得意忘形...简单的 90% 解决方案比不起作用的 100% 解决方案要好。
世界需要更简单的代码......
只需使用 HTML 检查输入的电子邮件地址是否有效。
<input type="email"/>
无需编写验证函数。
就是这样 节点验证器 可以:
/^(?:[\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])\]))$/
很难让电子邮件验证器 100% 正确。使其正确的唯一真正方法是将测试电子邮件发送到该帐户。也就是说,有一些基本检查可以帮助确保您获得合理的结果。
一些需要改进的地方:
而不是新的 RegExp
, ,只需尝试编写 regexp
像这样输出:
if (reg.test(/@/))
其次,检查以确保句号之后是句号 @
符号,并确保符号之间有字符 @
s 和句号。
在验证器函数中使用此代码:
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
}
正则表达式更新 2018!尝试这个
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');
}
打字稿版本完成
//
export const emailValid = (val:string):boolean => /^[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);
更多信息 https://git.io/vhEfc
符合 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])+
显然,就是这样:
/^([\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
取自 http://fightingforalostcause.net/misc/2006/compare-email-regex.php 2010 年 10 月 1 日。
但是,当然,这忽略了国际化。
相比之下 杰尼龟, ,这是一个复杂的解决方案,但它在正确验证电子邮件方面做得非常好:
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'); }
这是关于使用正则表达式验证电子邮件地址的非常好的讨论;”比较电子邮件地址验证正则表达式"
这是当前的顶级表达式,与 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
我的知识 常用表达 不太好。这就是为什么我首先使用简单的正则表达式检查一般语法,然后使用其他函数检查更具体的选项。这可能不是最好的技术解决方案,但这样我就更灵活、更快。
我遇到的最常见的错误是空格(尤其是在开头和结尾),偶尔还有双点。
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
<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>
微软提供的正则表达式 ASP.NET MVC 是
/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/
我将其发布在这里以防万一它有缺陷 - 尽管它始终非常适合我的需求。
维基百科标准邮件语法:
https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte
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