使用正则表达式在 JavaScript 中验证电子邮件地址的最佳方法是什么?
在 JavaScript 中验证电子邮件地址的最佳方法是什么?
使用正则表达式可能是最好的方法。你可以在这里看到一堆测试(取自铬)
const validateEmail = (email) => {
return String(email)
.toLowerCase()
.match(
/^(([^<>()[\]\\.,;:\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,}))$/
);
};
以下是接受 unicode 的正则表达式示例:
const re =
/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
但请记住,不应仅依赖 JavaScript 验证。JavaScript 很容易被禁用。这也应该在服务器端进行验证。
这是上述操作的示例:
const validateEmail = (email) =>
return email.match(
/^(([^<>()[\]\\.,;:\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,}))$/
);
};
const validate = () => {
const $result = $('#result');
const 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;
}
$('#email').on('input', validate);
这是html
:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="email">Enter an email address: </label>
<input id="email" />
<h2 id="result"></h2>
对于想要以以下形式进行真正简单验证的人,我稍微修改了Jaymon 的答案:
anystring@anystring.anystring
正则表达式:
/\S+@\S+\.\S+/
要防止匹配多个@ 符号:
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
JavaScript 函数示例:
function validateEmail(email)
{
var re = /\S+@\S+\.\S+/;
return re.test(email);
}
console.log(validateEmail('anystring@anystring.anystring'));
为了完整起见,这里有另一个符合 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
因此,即使遵循官方标准,仍然需要权衡取舍。不要盲目复制在线图书馆或论坛中的正则表达式。始终在您自己的数据和您自己的应用程序上测试它们。
强调我的
哇,这里有很多复杂性。如果您只想捕获最明显的语法错误,我会这样做:
^\S+@\S+$
它通常会捕获用户犯的最明显的错误并确保表单大部分是正确的,这就是 JavaScript 验证的全部内容。
编辑:我们还可以检查 '.' 在电子邮件中使用
/^\S+@\S+\.\S+$/
当您决定使用正则表达式来验证电子邮件时,您必须了解一些事情:这可能不是一个好主意。一旦你接受了这一点,有很多实现可以让你成功,本文很好地总结了它们。
然而,简而言之,绝对、肯定地确定用户输入的内容实际上是电子邮件的唯一方法是实际发送电子邮件并查看会发生什么。除此之外一切都只是猜测。