logo
Published on

如何在JavaScript中验证电子邮件地址?

Authors
  • Name
    Twitter

在现代Web开发中,验证电子邮件地址是一个非常常见的需求。使用正则表达式进行验证可能是最好的方法。本篇博客将详细探讨多种验证方法,展示代码示例,并解释它们的优缺点。

基本的正则表达式验证

以下是一个基础的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支持的正则表达式

如果你需要支持包含Unicode字符的电子邮件地址,可以考虑使用下述正则表达式:

const re =
  /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i

注意,虽然这个正则表达式更具包容性,但它仍然无法替代服务器端的验证。

示例:在客户端验证电子邮件地址

除了单独的正则表达式验证,还可以结合HTML和jQuery来进行更直观的验证。以下是一个示例:

<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>

<script>
  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>

在这个例子中,用户输入的电子邮件地址将被动态验证,并且结果立即显示在页面上。

简单的正则表达式

有时候,我们只需要非常简单的验证。这里有一个简单的正则表达式:

const simpleRegex = /^\S+@\S+\.\S+$/

这个正则表达式只检查电子邮件地址中是否包含至少一个"@"字符和一个点(.),满足基本的格式要求。

基于HTML5的验证

HTML5本身提供了内置的电子邮件验证功能:

<form>
  <label
    >Email Address
    <input type="email" placeholder="me@example.com" required />
  </label>
  <input type="submit" />
</form>

这个功能在现代浏览器中默认支持,但仍然需要在服务器端进行验证,以确保数据的完整性和安全性。

RFC规范的正则表达式

如果您需要更严格地遵循RFC 2822标准,可以使用以下正则表达式:

const rfcRegex =
  /(?:[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])+)\])/

小结

尽管JavaScript可以提供便捷的电子邮件验证功能,我们不能仅依赖它进行验证。JavaScript容易被客户端禁用或绕过,因此在服务器端对数据进行验证是必要的。

最后,正如许多开发者所建议的,要确保电子邮件地址有效的唯一方法是实际上向该地址发送验证邮件。

希望这篇博客能帮助你更好地理解如何在JavaScript中验证电子邮件地址!