在将用户输入发送到服务器或尝试向其发送电子邮件之前,为了防止最基本的打字错误,我想在JavaScript中检查用户输入是否为电子邮件地址。 我该如何实现此目标?
在将用户输入发送到服务器或尝试向其发送电子邮件之前,为了防止最基本的打字错误,我想在JavaScript中检查用户输入是否为电子邮件地址。 我该如何实现此目标?
在JavaScript中,使用 正则表达式 可能是验证电子邮件地址的最佳方法。查看来自JSFiddle的一系列测试 来自Chromium。
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,}))$/
);
};
const re =
/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
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 invalid.');
$result.css('color', 'red');
}
return false;
}
$('#email').on('input', validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="email">Enter email address</label>
<input id="email" type="email">
<p id="result"></p>
%2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.com
都是有效的,但 Gmail 永远不会允许任何这些电子邮件地址。你应该通过接受电子邮件地址并向该电子邮件地址发送一封电子邮件消息来实现这一点,其中包含一个用户必须访问以确认有效性的代码/链接。 - Kevin Feganemail@localhost
、我没有电子邮件
或任何其他有趣的用户输入发送电子邮件可能没有意义。 - undefinedsean.o'leary@cobbcounty.org
,你的代码无法验证它,它说是有效的电子邮件。 - Code Cooker我稍微修改了Jaymon的回答,以便提供真正简单的表单验证:
anystring@anystring.anystring
正则表达式:
/^\S+@\S+\.\S+$/
为了防止多个@符号的匹配:
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
以上的正则表达式匹配整个字符串,如果你希望在字符串中任何地方匹配,可以去掉开头的^
和结尾的$
。下面的例子匹配字符串中的任何位置。
如果你确实想要匹配整个字符串,可能需要先使用trim()
函数处理字符串。
JavaScript示例函数:
function validateEmail(email) {
var re = /\S+@\S+\.\S+/;
return re.test(email);
}
console.log(validateEmail('my email is anystring@anystring.any')); // true
console.log(validateEmail('my email is anystring@anystring .any')); // false
name@again@example.com
。请尝试将你的代码粘贴到 JavaScript 控制台中。我相信你的意图是仅匹配整个文本,这需要使用文本开头 '^' 和文本结尾 '$' 的操作符。我正在使用的是 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
。 - OregonTrail@
符号(作为注释),同时电子邮件并不一定需要包含一个句号。 - ruohola[^\s@]
表示“既不是空格字符也不是 @
字符”。[xyz]
表示 x、y 或 z 中的任意一个字符,而 [^xyz]
表示除了 x、y 或 z 之外的任何一个字符。\s
表示“任何空格字符”,\S
表示“任何非空格字符”。 - Jelaby为了完整起见,这里有另一个符合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+$/
{2,6}
以确保句点后的字符串长度在 2 到 6 个字符之间? - Avatar一旦你决定使用正则表达式来验证电子邮件,就必须要明白一件事情:这可能不是一个好主意。一旦你认识到这一点,就有很多实现可以让你完成其中的一半,这篇文章概括得很好。
然而简单来说,唯一可以绝对肯定用户输入的内容是电子邮件的方法就是实际发送一封电子邮件并观察结果。除此之外都只是猜测。
HTML5本身具有电子邮件验证功能。如果您的浏览器支持HTML5,则可以使用以下代码。
<form>
<label>Email Address
<input type="email" placeholder="me@example.com" required>
</label>
<input type="submit">
</form>
jsFiddle链接。
来自HTML5规范:
有效的电子邮件地址是一个与以下ABNF中的
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])?)*$/
form
标签内并由一个submit
输入提交,而不是每个人都能做到。另外,你不能真正地设计错误信息的样式。 - Jasonbar@domain
(缺少扩展名),A@b@c@example.com
(多个@)等等(参见https://en.wikipedia.org/wiki/Email_address#Examples)。我在这里找到了一个好的正则表达式:https://emailregex.com。 - Thomas Champion@
仅在额外的 "@" 出现在用户名部分并被双引号括起来时才有效。似乎自2013年以来第二个点(缺少扩展名)也不再有效(https://www.icann.org/en/announcements/details/new-gtld-dotless-domain-names-prohibited-30-8-2013-en),但是这取决于情况,我猜有人可能认为扩展名是可选的。最后,我选择了 joi 中的 address
模块:https://joi.dev/module/address/api/?v=4.1.0#emailisvalidemail-options 来验证我的应用程序中的电子邮件地址。 - Thomas Champion我发现这是最好的解决方案:
/^[^\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 5. #!$%&'*+-/=?^_`{}|~@example.org 6. "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org 7. " "@example.org(引号间有空格) 8. üñîçøðé@example.com(本地部分使用 Unicode 字符) 9. üñîçøðé@üñîçøðé.com(域名部分使用 Unicode 字符) 10. Pelé@example.com(拉丁文) 11. δοκιμή@παράδειγμα.δοκιμή(希腊文) 12. 我買@屋企.香港(中文) 13. 甲斐@黒川.日本(日文) 14. чебурашка@ящик-с-апельсинами.рф(西里尔文)
显然,它具有很强的适应性,并允许重要的国际字符,同时仍强制遵循基本的 anything@anything.anything 格式。它会阻止 RFC 技术上允许的空格,但它们非常罕见,我很高兴这样做。
在现代浏览器中,你可以使用纯JavaScript和DOM基于@Sushil的回答进行构建:
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);
}
我已经在这个fiddle中提供了一个示例http://jsfiddle.net/boldewyn/2b6d5/。结合特征检测和来自Squirtle's Answer的基本验证,它可以避免使用正则表达式,并且不会在旧浏览器上出现问题。
input.required = true;
这行代码了吗? - Boldewynuser@localhost
这样的电子邮件地址会比没有任何作用更糟糕。它将会主动阻碍正确填写表单的过程。 - BoldewynJavaScript可以匹配正则表达式:
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)>)$
(?>
来停止回溯和(?<angle><)…(?(angle)>)
来避免提供冗长的|
。 - Ry-match
方法返回一个数组,而对于这种情况,返回布尔值的 test
方法会更好。 - iPzardemail.includes('@')
或者,如果您需要支持IE/旧版浏览器:
email.indexOf('@') > 0