Angular.js: 电子邮件验证程序错误

创建于 2014-01-20  ·  26评论  ·  资料来源: angular/angular.js

如果您输入电子邮件地址:
me @ .example.com

它说电子邮件是有效的。

在此URL(从文档中)中进行检查:

http://docs.angularjs.org/api/ng.directive:input.email

moderate bug

最有用的评论

您可以使用ng-pattern快速修复此问题

<input type="email" ng-pattern="/^[_a-z0-9]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/">

所有26条评论

是的,您是对的,看来EMAIL_REGEX是错误的。

根据http://dev.w3.org/html5/markup/input.email.html ,我们可以使用

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

而且看起来应该更好地工作,由于不包括.以下的@

我将尝试为此提交一个快速补丁。

...实际上,这比我想象的要复杂一些,这可能需要更多的工作。 看起来它也将接受以句点开头的正则表达式。 我想这里需要做一些工作。

如果您能在我之前解决此问题,请随时提交请求请求

感谢您的错误报告。 在文档演示中,您不会在1.2.10下降之前注意到此修复,因为它始终会加载1.2.9角度脚本。 但是几天后,您应该会在文档演示中看到此问题(除非提交已还原,否则可能会发生O_O)

太好了,十倍!

2014年1月22日,星期三,5:32,Caitlin Potter [email protected]

感谢您的错误报告。 在文档演示中,您不会注意到此修复程序
直到1.2.10下降,因为它一直加载1.2.9角度脚本。
但是几天后,您应该会在文档演示中看到此问题

-
直接回复此电子邮件或在Gi tHub上查看它

当我注意到“ dummy @ ferferfe ”(不包含任何域)被视为有效邮件时,我的表情是什么?

@ mica16,dummy@ferferfe是有效的电子邮件地址。 域不需要扩展名,只需考虑localhost

@Zequez是正确的,但是在示例中,到底谁使用本地主机地址进行网站注册?

@mbeckenbach使用
ng-pattern =“ / ^ [a-z0-9!#$%&'* + / =?^ _`{|}〜.-] + @ [a-z0-9-] +。[a-z0 -9-] /“
不理想,但可行。

@mbeckenbach是的,是的。 但是请考虑没有点的域名是有效域名。 ICANN不允许您在THEM中注册域名,并不表示该域名无效。

6 @ 6不是电子邮件地址。 在我看来,在特殊情况下它可能是正确的电子邮件地址这一事实不应导致我们允许它。 通过这种允许的模式解决错误的几率要比我们排除具有此类电子邮件地址的人的几率大几个数量级。

杰夫+1

@jeffmcmahan对不起,但听起来您应该向IETF或WHATWG提出问题。 一旦电子邮件地址的定义看起来有所更改,则应在Angular中对其进行更改,但是我们确实需要遵循RFC和WHATWG建议中描述的内容。

现在,如果您确实想更严格一点,则还可以添加一个模式验证器,这很好。

@caitp你是老板。

如何配置EMAIL_REGEXP? 我们的服务器端验证比angularjs更为严格。 具体而言,例如要求@符号前的部分不超过63个字符。 现在,我们必须为所有电子邮件输入创建一个自定义指令,或者记住将ng-pattern添加到每个电子邮件输入中。

您除了可以使用type = email和@rjokelai之外,还可以使用ng- @ matsko的验证管道更改将使添加自定义电子邮件验证更加容易

“现在,如果您想更严格一点,那么您还可以添加一个模式验证器,这很好。”

默认验证程序如何只接受带有点号的普通电子邮件,如果少数人希望不严格,则可以创建自己的验证程序。 为什么绝大多数开发人员都需要制作自己的模式,以使极少数的开发人员不必这么做? 这是愚蠢的标准纯粹主义

因为这基本上是用于html5约束验证的polyfill,这就是原因。 希望下周我们将发布一项功能,该功能将使自定义更加容易

没有域区域的电子邮件是否有效? 我正在测试type =“ email”的简单输入字段,并且Angular成功验证_foo @ bar_ email。 (角度v1.3.0)

哦,已经有一个封闭的问题-https: //github.com/angular/angular.js/issues/9463

没有域区域的电子邮件是否有效? 我正在测试type =“ email”的简单输入字段,并且Angular成功验证foo @ bar电子邮件。 (角度v1.3.0)

根据规范,它们是有效的电子邮件。 在此问题跟踪器上已经多次回答了这个问题,没有TLD的电子邮件没有什么无效的。

使用自定义验证器来要求您想要的特定TLD

@caitp ,我知道我们一直在困扰您,但我认为如果您解释了为什么必须遵循规格说明可能会有所帮助。 我们都认识到,一个合理且称职的开发人员不会假设电子邮件验证程序允许_0 @ 0_。 也就是说,它将用于标准表单注册情况,并且在许多这种情况下会引起问题。 我们被告知,遵守规范的重要性超过了这些问题。 好吧-太酷了但为什么?

因为当您的浏览器说它是有效的而角度说它不是有效的时候,这真的很奇怪

您不是在寻找电子邮件验证,而是在电子邮件验证之上寻找模式验证--您想要匹配特定模式(包含TLD)的有效电子邮件地址(按角度处理)

  1. 当您添加模式验证然后“您的浏览器说它有效而[A] ngular说它无效”时,这会很奇怪吗? 否。那么,如果内置了模式验证,为什么会很奇怪?
  2. 我们都知道,在我们感兴趣的用例中,有效电子邮件传递的内容比规范要狭窄。

_我只想知道为什么Angular不应该为我感兴趣的用例提供服务,因为这是一般用例。

那么,如果内置了模式验证,为什么会很奇怪呢?

实际上,您从浏览器中获得了相同的行为。 http://jsfiddle.net/t6rdmngo/如果您在现代浏览器中运行此代码,则如果不包含TLD,则由于模式不匹配而无法提交顶部表单。

在有角度的版本中,您将获得相同的行为。 很好这就是我们想要的。 本地行为与框架行为之间的行为相同。 框架不应与平台存在分歧

现在我懂了。 感谢您的支持!

您可以使用ng-pattern快速修复此问题

<input type="email" ng-pattern="/^[_a-z0-9]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/">

如果将正则表达式中的最后一个*更改为+,它将按预期工作

http://w3c.github.io/html-reference/input.email.html

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a -zA-Z0-9-] +)+ $ /

此页面是否有帮助?
0 / 5 - 0 等级