【问题标题】:Email validation in Javascript - how to add extra conditionsJavascript 中的电子邮件验证 - 如何添加额外条件
【发布时间】:2021-08-27 19:47:38
【问题描述】:

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

  • 电子邮件地址不能以特殊字符开头或结尾

  • 电子邮件地址不能有双特殊字符 已编辑 特殊字符是

    ! # $ % & ' * + - / = ? ^ _ ` { | } ~

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

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

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.

【问题讨论】:

  • 什么是特殊字符?
  • @jabaa 已编辑,谢谢!
  • 您的验证没有找到所有有效地址:regexr.com/5voh7 根据en.wikipedia.org/wiki/Email_address " "@example.org 是一个有效的电子邮件地址。如果你不支持官方 RFC,你应该描述支持的模式。
  • 如果您要求正则表达式解决方案,那么您应该包括示例输入和预期结果(通过/失败)。见:stackoverflow.com/tags/regex/info
  • @JDB 完成!添加了一些示例

标签: javascript email-validation


【解决方案1】:

你有三个选择。

  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 上的任何人尝试该代码,则必须提供完整列表。

【讨论】:

  • 我喜欢选择 2。我同意你的 1) 但我的老板想要客户端验证所以......
猜你喜欢
  • 2015-09-28
  • 2023-04-06
  • 2011-10-20
  • 2011-02-16
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2010-12-20
  • 2014-02-17
相关资源
最近更新 更多