没有域扩展的电子邮件验证通过

Email validation passes without domain extension

我在我的项目中使用 Aurelia-Validation 并尝试验证电子邮件地址。当我添加电子邮件 example@g 时,它通过了验证。电子邮件验证不应该在末尾有 .com.net 等扩展名才能通过验证吗?以 plunker link 为例。

这是显示我的意思的屏幕截图:

使用以下代码更改了我的验证规则:

原代码:

ValidationRules.ensure('setEmail')
    .displayName('Email')
    .required()
    .email()
    .on(this);

修改后的代码匹配模式:

ValidationRules.ensure('setEmail')
    .displayName('Email')
    .required()
    .email()
    .matches(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/)
    .on(this);

见截图:

无效:

有效:

这有点挑剔,但正如 emix 已经在评论中指出的那样,aurelia-validation 使用的验证正则表达式目前是 WHATWG. This is the same regex as documented on MDN and w3.org.[=20 指定的广泛接受的标准=]

Mozilla 似乎至少遵循此规范来验证 input type="email"。不过,我在 chrome 或 edge 上找不到任何官方资源。

该正则表达式的 JavaScript 版本是:

/^[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])?)*$/

简单来说,这意味着:

  1. (必需)在@符号之前,任意数量的字母数字字符和(某些)符号
  2. (必需)在 @ 符号之后,1 到 63 个字母数字字符或连字符(不能以连字符开头或结尾)
  3. (可选)与 2 相同(但以句点开头),重复任意次数

如果您想将此验证限制为可在 Internet 上路由的电子邮件,只需将正则表达式末尾的星号 * 更改为加号 +。这使正则表达式保持相同,除了现在必须 至少一个 段以句点开头。

/^[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])?)+$/

在最新版本中,我认为我们可以在 formControl 验证器中使用 Validators.pattern(REGEX_VALID_EMAIL) 而不是 Validators.email

REGEX_VALID_EMAIL可以是下面的

const REGEX_VALID_EMAIL = /^[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])?)+$/
;