为什么 HTML5表单验证允许电子邮件没有点?

我正在编写一个非常简单的模型来演示一些 HTML5表单验证。但是,我注意到电子邮件验证不检查地址中的点,也不检查所说的点后面的字符。

换句话说,“ john@doe”被认为是有效的,当它显然不是一个有效的电子邮件地址; “ doe”不是一个域名。

这是我如何编写我的电子邮件字段:

<input type="email" required />

这还不够吗?

检查这个 小提琴看看我的意思。

注意: 我知道如何通过 RegEx 模式来实现这一点。我只是好奇怎么会有人用电子邮件来代替。

72299 次浏览

尝试将其添加到输入中

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

小提琴

理论上你可以有一个没有“。”的地址。

因为技术上来说:

user@com
user@localserver
user@[IPv6:2001:db8::1]

都是有效的电子邮件。

因此,标准的 HTML5验证允许所有有效的电子邮件,包括不常见的电子邮件。

对于一些容易阅读的解释(而不是通读标准) : Http://en.wikipedia.org/wiki/email_address#examples

更新 来自评论: ICANN 禁止所谓的“无网点”域名在2013年,但是因为这并不影响上面列出的所有情况,允许“无点”地址仍然是有效的。

因为@b 是一个有效的电子邮件地址(如 localhost 是一个有效的域)

另外,请记住您应该始终在服务器中进行输入验证。客户端验证应该仅用于向用户提供反馈,而不应该被依赖,因为它很容易被忽略。

RFC 822,第6章,给出了一个增强的 Backus-Naur 格式(BNF)的地址规范:

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

使用此规范 a@b是一个有效的地址。

更新

为了回答 Trejkaz 的评论,我添加了以下定义。我们看到空间是允许的,但只能在引号字符串中使用。

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL>
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR

您可以自定义电子邮件字段的模式:

input:valid {
border-color: green
}


input:invalid {
border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>


Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />

这种模式对我总是有效。

文本必须在小写 pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$",但我认为它涵盖或多或少大多数电子邮件。

这个 MDN 页面显示了正则表达式浏览器应该用来验证电子邮件:

Https://developer.mozilla.org/en-us/docs/web/html/element/input/email#validation

您可以稍微更改这个正则表达式,以在域名中至少要求一个点: 将正则表达式末尾的星号 *更改为加号 +。然后使用正则表达式作为 pattern属性:

<form>
<input
type="email"
pattern="^[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])?)+$"
title="Valid e-mail address including top-level domain"
required
/>
<button type="submit">Test</button>
</form>

下面介绍如何使用正则表达式模式来处理 html5。还可以包括要显示的自定义消息。

<form>
<input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
<button type="submit">Click Me</button>
</form>

没有 TLD 的主机名似乎是有效的。

我说“出现”是因为有这样的 2013年互联网名称与数字地址分配机构禁止无点域名. 。

在2013年8月13日的会议上,ICANN 董事会新的 gTLD 计划委员会(NGPC)通过了一项决议,确认“无网点域名”是被禁止的。

... 但从现实世界的经验来看,这似乎从未被强制执行过。

不管怎样,PHP 函数 FILTER_VALIDATE_EMAIL不允许无点的域名。

因此,这里有一个简单的后端验证设置,涵盖您的电子邮件和必填字段:

if (empty($required_field) OR empty($another_required_field) OR
!filter_var($email_field, FILTER_VALIDATE_EMAIL)) {
// error handling here
exit;
}

虽然“畸形”邮件可能通过浏览器,但它不会通过服务器。


参考文献: