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


112

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

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

这是我编码电子邮件字段的方式:

<input type="email" required />

这还不够吗?

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

注意:我知道如何通过RegEx模式来完成此操作。我只是想知道有人如何代替使用电子邮件类型。


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.是的,doe绝对可以是一个域(请考虑localhost),并且该地址在技术上根据规范有效。
admdrew

2
@admdrew嘿...如果您从邮件服务器本身发送电子邮件并决定写“ friend @ localhost”,这将是一个有趣的情况
Katana314 2013年

@ Katana314-嘿 大多数(配置良好的)邮件服务器将拒绝发送到与预期域不匹配的地址的邮件,因此通常来说localhost地址没有问题。
admdrew

Answers:


83

因为a @ b是有效的电子邮件地址(例如localhost是有效的域)。请参阅http://en.wikipedia.org/wiki/Email_address#Examples

另外,请记住,您应该始终在服务器中进行输入验证。客户端验证应仅用于向用户提供反馈,而不应依赖于此,因为可以轻松地绕过它。


7
谢谢。我只是看不到任何公司可以从这种开箱即用的电子邮件验证中受益。Facebook不允许有人使用a @ b地址进行注册。谢谢你的信息。(我没有拒绝您的回答)
WEFX 2013年

6
对于像Facebook这样的具有公共访问权限的网站,这是没有用的。但是想想内部网站。您可能想写信给joe @ support。但是我也认为它是最少用的。但是,Web浏览器将基于标准(即RFC)而非最常见的情况来实现。
Ali Alavi

9
我想知道上次有人真正向本地主机发送电子邮件的时间是什么时候!
马修·洛克

2
附带说明,最短的工作电子邮件地址之一(recordsetter.com/world-record/shortest-email-address/4327)是au@ua
Kyborek '18

132

理论上,您可以使用不带“。”的地址。在。

从技术上讲,诸如:

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

是所有有效的电子邮件。

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

对于一些易于理解的解释(而不是通读标准):http : //en.wikipedia.org/wiki/Email_address#Examples


1
同意,此答案回答“为什么”,而不是“解决方案”。我也很好奇为什么。现在我知道不要“修复”。
埃莉诺·齐默尔曼

第一种类型的示例是domain uz,它直接指向截至2018年10月的IP。如果执行nslookup uz,它指向91.212.89.8,因此也应该可以在该域上接收电子邮件。
PulseJet

36

尝试将其添加到输入中

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

小提琴


2
有了许多新的可用域,例如(accountants [11],international [13]等)并且潜在的最大长度为63,则正则表达式模式的长度值应为{2,63}。
unasAquila 2014年

42
-1。首先,您甚至没有试图解释这确实允许或限制了什么,也没有解释为什么有人想要这些规则。其次,它比标准所允许的限制要严格得多(我不会假装已经阅读并理解了这些标准,但是例如,请参阅en.wikipedia.org/wiki/Email_address#Internationalization或Stack上的许多电子邮件验证问题溢出(例如怪异的电子邮件地址)。为什么呢 如果有人输入不寻常的邮件作为电子邮件,那就接受它-他们可能比您更了解。
Mark Amery

7
实际上,我想说的是“机会”是他们犯了一个错误。可能是因为他们有一个非常不寻常的电子邮件地址,但我想说的是,大多数时候,如果您要阻止它通过验证并提示输入密码,则只需获得正确的电子邮件地址即可代替不正确的电子邮件地址。用户检查。
Geoff Kendall

1
它应该有一个^,表示它应该从字符串的开头开始匹配并接受大写字母:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese

13

RFC 822,第6章,给出了一个地址的在扩充巴科斯范式(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  

OTOH,RFC 822还允许我在本地部分中放置空格,Chrome似乎不允许这样做,因此我不确定它们是否使用RFC作为参考。(即使应该!)
Trejkaz

8

在此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>

3

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

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" />


2

这是使用regex模式使用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>


-5

这种模式始终对我有用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.