我正在编写一个非常简单的模型来演示一些HTML5表单验证.但是,我注意到电子邮件验证没有检查地址中的点,也没有检查点后面的字符.
换句话说,"john @ doe"被认为是有效的,当它显然不是有效的电子邮件地址时; "doe"不是域名.
这就是我编写电子邮件字段的方式:
这还不够吗?
检查这个小提琴,看看我的意思.
注意:我知道如何通过RegEx模式来实现这一点.我只是想知道如何使用电子邮件类型取而代之.
尝试将此添加到输入中
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
因为@b是有效的电子邮件地址(例如localhost是有效的域).请参见http://en.wikipedia.org/wiki/Email_address#Examples
另外,请记住,您应该始终在服务器中进行输入验证.客户端验证应仅用于向用户提供反馈而不是依赖,因为它可以被轻松绕过.
在此MDN页面上,它显示了正则表达式浏览器应使用该电子邮件来验证电子邮件:
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input/email#Validation
您可以稍稍更改此正则表达式,使其在域名中至少需要一个点:*
将正则表达式末尾的星号更改为plus +
。然后使用该正则表达式作为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>
的RFC 822,第6章,给出了一个地址的在扩充巴科斯范式(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