在 JavaScript 中验证电子邮件地址的最佳方法是什么?

IT技术 javascript regex validation email-validation
2020-12-12 22:33:07

使用正则表达式在 JavaScript 中验证电子邮件地址的最佳方法是什么?

6个回答

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

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>
@KevinFegan 让我们现实一点:您不会使用 JavaScript 来确认电子邮件是否真实。当用户注册时,我认为这种验证是完全合理的。您可能不想费心向不可能存在的地址发送验证电子邮件。有些人可能也有出站电子邮件的限制,使其成为北方值得发送电子邮件至email@localhosti don't have an email或任何其他有趣的用户输入。
2021-02-07 22:33:07
这甚至不接受 RFC 822 中的示例。一些简单的情况下它与 a\@b@c.com、a(b)@c.com 不匹配。有关更多信息,请参阅 RFC。这是一个不会拒绝任何有效地址 [^@]+@[^@]+\.[^@]+ 并防止常见错误的正则表达式。
2021-02-11 22:33:07
gautam+@Gmail.com - 显示是有效的,不应该
2021-02-12 22:33:07
此正则表达式消除了有效的、使用中的电子邮件。不使用。谷歌搜索“RFC822”或“RFC2822”以获得正确的正则表达式。
2021-02-22 22:33:07
您无法验证电子邮件地址、句点。唯一可以验证电子邮件地址的人是电子邮件地址的提供者。例如,这个答案说这些电子邮件地址:%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 永远不会允许这些电子邮件地址中的任何一个。为此,您应该接受电子邮件地址并向该电子邮件地址发送一封电子邮件,其中包含用户必须访问的代码/链接以确认有效性。
2021-03-07 22:33:07

对于想要以以下形式进行真正简单验证的人,我稍微修改了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'));

电子邮件可以包含多个@符号(作为评论),电子邮件也不必包含句点。
2021-02-10 22:33:07
@ImmortalFirefly,您提供的正则表达式实际上将匹配name@again@example.com. 尝试将您的行粘贴到 JavaScript 控制台中。我相信您的意图是只匹配整个文本,这需要文本 '^' 的开头和文本 '$' 运算符的结尾。我正在使用的是/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
2021-02-18 22:33:07
您可以实现 20 倍的时间,这可能会给少数用户带来问题,并且将来可能无效,或者您可以获取 ImmortalFirefly 的版本,以确保他们至少努力使其看起来真实。根据您的应用程序,可能更有可能遇到某人会生气,因为您不接受他们的非常规电子邮件,而不是通过输入实际上不存在的电子邮件地址而导致问题的人(他们无论如何都可以通过输入100% 有效的 RFC2822 电子邮件地址,但使用未注册的用户名或域)。点赞!
2021-02-20 22:33:07
第二个正则表达式不需要顶级域,即它接受user@domain. 但 AFAIK 这实际上是一个有效的电子邮件地址,虽然不常见。第一个正则表达式需要 TLD,因此它不包括这些类型的地址。
2021-03-04 22:33:07

为了完整起见这里有另一个符合 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

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

强调我的

注意:“今天实际使用”在编写代码时可能是有效的,回到 200 倍。该代码可能保持在超出特定年份使用。(如果我为每个“meh,除了那些特定的 TLD 之外,没有人会使用 4+ 个字母的 TLD”一角钱,我必须修复,我可以垄断世界的铜和镍市场;))
2021-02-20 22:33:07
请注意,这不会捕获一些有效的电子邮件地址,例如这些表情符号:mailoji.com
2021-02-24 22:33:07

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

^\S+@\S+$

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

编辑:我们还可以检查 '.' 在电子邮件中使用

/^\S+@\S+\.\S+$/
但它不会接受“Mohit Atray”@gmail.com,因为它包含空格字符。也许我们应该只使用 /^\S.*@\S+$/ 正则表达式。
2021-02-14 22:33:07
+1 作为发送电子邮件并查看会发生什么是验证电子邮件地址的唯一真正可靠的方法,除了简单的正则表达式匹配外,无需做更多的事情。
2021-02-20 22:33:07

当您决定使用正则表达式来验证电子邮件时,您必须了解一些事情:这可能不是一个好主意一旦你接受了这一点,有很多实现可以让你成功,本文很好地总结了它们。

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

@kommradHomer——“正则表达式无效”地址几乎总是有效的,因为无论您使用什么正则表达式来验证电子邮件地址几乎肯定是错误的,并且会排除有效的电子邮件地址。电子邮件地址name_part@domain_part和几乎任何东西,包括@,是在name_part有效; 该地址foo@bar@machine.subdomain.example.museum是合法的,但必须将其转义为foo\@bar@machine..... 一旦电子邮件到达域,例如“example.com”,该域就可以“本地”路由邮件,因此可以存在“奇怪的”用户名和主机名。
2021-02-23 22:33:07