没有域扩展的电子邮件验证通过
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 到 63 个字母数字字符或连字符(不能以连字符开头或结尾)
- (可选)与 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])?)+$/
;
我在我的项目中使用 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 到 63 个字母数字字符或连字符(不能以连字符开头或结尾) - (可选)与 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])?)+$/
;