如何在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(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的正则表达式
官方标准被称为 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对那些想要以下列形式进行简单验证的人的答案:
anystring@anystring.anystring
正则表达式:
/\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">
<input type="submit">
</form>
的jsfiddle 链接
来自 HTML5规范:
一个 合法的邮件地址 是一个匹配的字符串
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.“()[] :,; @ \\\”!#$%&'* + - / =?^ _`{} | 〜。一“@ example.org 7.“”@ example.org(引号之间的空格) 8.üñîçøðé@example.com(本地部分的Unicode字符) 9.üñîçøðé@üñîçøðé.com(域部分中的Unicode字符) 10.Pelé@example.com(拉丁文) 11.δοκιμή@παράδειγμα.δοκιμή(希腊语) 12.我买@屋企。香港(中文) 13.甲斐@黒川。日本(日文) 14.чебурашка@ящик-с-апельсинами.рф(西里尔文)
它显然是多功能的,允许所有重要的国际角色,同时仍然执行基本的any@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/。结合功能检测和来自的简单验证 Squirtle的回答,它让你从正则表达式大屠杀中解放出来,并且不会在旧浏览器上出现问题。