为什么HTML5表单验证允许没有点的电子邮件?
我正在编写一个非常简单的模型来演示一些HTML5表单验证。 但是,我注意到电子邮件验证没有检查地址中的点,也没有检查点后面的字符。
换句话说," john @ doe" 如果它显然不是有效的电子邮件地址,则视为有效;" DOE" 不是一个域名。
这就是我编写电子邮件字段的方式:
<input type="email" required />
这还不够吗?
检查这个小提琴,看看我的意思。
注意:我知道如何通过RegEx模式来实现这一点。 我只是想知道某人如何使用电子邮件类型取而代之。
理论上你可以有一个没有&#34;的地址。&#34; 在。
从技术上来说,例如:
user@com
user@localserver
user@[IPv6:2001:db8::1]
都是有效的电子邮件。
因此,标准的HTML5验证允许所有有效的电子邮件,包括不常见的电子邮件。
对于一些易于阅读的解释(而不是阅读标准):[http://en.wikipedia.org/wiki/Email_address#Examples]
因为@b是有效的电子邮件地址(例如localhost是有效的域)。 见[http://en.wikipedia.org/wiki/Email_address#Examples]
另外,请记住,您应该始终在服务器中进行输入验证。 客户端验证应仅用于向用户提供反馈而不是依赖,因为它可以被轻松绕过。
尝试将此添加到输入中
pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"
小提琴
RFC 822第6章给出了增强Backus-Naur形式(BNF)中地址的规范:
addr-spec = local-part "@" domain
local-part = word *("." word)
domain = sub-domain *("." sub-domain)
使用此规范a@b
是有效地址。
UPDATE
为了回答Trejkaz的评论,我添加了以下定义。 我们看到SPACE是允许的,但仅限于带引号的字符串。
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
您可以自定义电子邮件字段的模式:
Email:
<input type="email" required value="a@b.c" /><br>
Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />
Email:
<input type="email" required value="a@b.c" /><br>
Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />
在此MDN页面上,它显示正则表达式浏览器应用于验证电子邮件:
[https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation]
您可以稍微更改此正则表达式以要求域名中至少有一个点:将正则表达式末尾的星号*
更改为加号+
.然后将该正则表达式用作pattern
属性:
<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])?)+$"></input>
这种模式总是适合我。
文本必须小写pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"
但我认为它涵盖了或多或少的大多数电子邮件。
这回答了这个问题。
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/