是否有 HTML5 输入电子邮件验证的 Java 实现?

Posted

技术标签:

【中文标题】是否有 HTML5 输入电子邮件验证的 Java 实现?【英文标题】:Is there a Java implementation of the HTML5 input email validation? 【发布时间】:2011-06-23 19:57:00 【问题描述】:

我想使用新的<input type="email" /> 元素。我想要在服务器上实现与浏览器中相同的验证的 Java 代码。

The html5 spec defines email addresses 在ABNF 中为:

1*( atext / "." ) "@" ldh-str *( "." ldh-str )

where:

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9

and:

atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
                       "!" / "#" /        ;  characters not including
                       "$" / "%" /        ;  specials.  Used for atoms.
                       "&" / "'" /
                       "*" / "+" /
                       "-" / "/" /
                       "=" / "?" /
                       "^" / "_" /
                       "`" / "" /
                       "|" / "" /
                       "~"

这些规则与RFC 5322 中的规则相同。 如何在 Java 中测试地址是否符合这些规则?

谢谢!

【问题讨论】:

我不知道是否存在现成的解决方案,但如果找不到,您可以使用 PEP 轻松创建一个。 ling.ohio-state.edu/~scott 【参考方案1】:

实际上,The W3C Recommendation you've cited 提供了一个正则表达式,相当于他们呈现为 ABNF 的内容,它定义了一个有效的电子邮件地址:

/^[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])?)*$/

但是这个正则表达式匹配无效的电子邮件地址,例如“.any..address.@123”(用https://regex101.com/测试)。

此正则表达式接受(根据Wikipedia,电子邮件地址中的所有内容均无效):

“。” (点)在本地部分的开头 “。” (点)在本地部分的末尾 多个连续的“.” (点)在局部 只有域部分的数字

并拒绝(根据***有效):

Unicode 字符 一些用引号 (") 分隔的特殊字符

请注意,W3C 声明他们提供的规范是 willful violation 的 RFC 5322,因此他们有一个“借口”可以省略有效的案例,但恕我直言,这不是接受无效地址的理由。

如果您不关心这些异常情况,您可以使用 W3C 建议的正则表达式。否则,您应该使用正则表达式来涵盖您要处理的情况。

【讨论】:

它不会拒绝所有非 ASCII 字符,因为它应该在 punycode 版本上执行,所以 example@яндекс.рф 将首先变成 example@xn--d1acpjx3f.xn--p1ai 并通过。它确实会拒绝在 @ 之前使用非 ASCII 字符的有效电子邮件地址。【参考方案2】:

你可以使用正则表达式:

[A-Za-z0-9!#$%&'*+-/=?^_`|~]+@[A-Za-z0-9-]+(.[A-Za -z0-9-]+)*

【讨论】:

user@domain 对此进行验证。 @ 后面不需要一个点吗? @Adam:这就是你的定义的意思。要回答你的问题,从技术上讲,不是。 我的错。 ABNF 中的* 包含 0。 这可能是为了支持(极少数)TLD 管理员并拥有像me@com 这样的地址的人 @ide:或用于非公共域的内部邮件服务器。

以上是关于是否有 HTML5 输入电子邮件验证的 Java 实现?的主要内容,如果未能解决你的问题,请参考以下文章

除了提交表单之外,触发 html5 电子邮件验证器失去焦点

HTML5中表单验证的好处

如何从JavaScript函数手动显示HTML5验证消息?

HTML 电子邮件验证输入 - HTML5

验证-- email类型输入框(电子邮件地址)--multiple

HTML5 必需属性不适用于 AJAX 提交