Javascript 中的电子邮件验证 - 如何添加额外条件

Email validation in Javascript - how to add extra conditions

我需要验证电子邮件地址,除了基本结构,我还需要

字符。 (句点、点或句号)前提是它不是第一个或最后一个字符,并且不会一个接一个地出现。

到目前为止,这就是我所拥有的,只是验证了基本结构

function emailIsValid (email) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
}

如何添加以上2个条件呢?谢谢

已编辑 有效地址

jen@gmail.com
jen@company.gov.ca
jen.doe@gmail.com
jen123@gmail.com

无效

@jen@gmail
jen@gmail
.jen@gmail.com
jen.@gmail.com
&jen@gmail.com
jen@gmail.com.

你有三个选择。

  1. 不用验证电子邮件地址。

这可能是最好的选择。最终,知道电子邮件地址是否合法的唯一方法是向该地址发送一段唯一数据并指示用户与您共享该唯一数据,证明他们可以访问邮箱(因此邮箱存在,因此它的地址是合法的)。

我不希望你听从这个建议。

  1. 在正则表达式之后添加额外条件

您知道,您 没有 使用一个正则表达式来完成整个工作。这样做实际上会更难。

由于您提供了列表,下面是对策略 2 的尝试:

const FORBIDDEN_TERMINAL_CHARACTERS = [
  `!`,
  `#`,
  `$`,
  `%`,
  `&`,
  `'`,
  `*`,
  `+`,
  `-`,
  `/`,
  `=`,
  `?`,
  `^`,
  `_`,
  '`', // single quotes around tick
  `{`,
  `|`,
  `}`,
  `~`
]

function emailIsValid (email) {
  let syntaxGood = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
  if(!syntaxGood) return false // skip loop if we've already failed
  
  for( let badChar of FORBIDDEN_TERMINAL_CHARACTERS ) {
    if(email.startsWith(badChar) || email.endsWith(badChar)) {
      return false // terminate early
    }
  }
  
  return true
}

这可能是您的次优选择。

  1. 将所有这些额外的逻辑塞进一个正则表达式中。

这是个坏主意。正则表达式有时被开玩笑地描述为“只写”:唯一能够理解正则表达式的人就是编写它的人,即使如此,也只有在他们积极创建它时。一旦进入后视镜,他们就会忘记所有毛茸茸的上下文细节,甚至对他们来说都变得不透明。祝未来的维护者在尝试修改此正则表达式时好运,例如你想在禁止字符列表中添加或删除一个字符。如果您没有针对此功能的一组非常强大的自动化测试用例,那么以后的每次编辑都可能会破坏某些东西。

如何对该正则表达式进行编码的细节将取决于具体的禁用字符列表。因此,如果您希望 SO 上的任何人尝试该代码,您将必须提供完整列表。