2011-02-09 67 views
8

我想使用新的<input type="email" />元素。我想让Java代码在服务器上实现与浏览器中相同的验证。是否有HTML5输入电子邮件验证的Java实现?

ABNFThe HTML5 spec defines email addresses为:

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中的这些规则?

谢谢!

+0

我不知道现成的解决方案是否存在,但如果找不到任何解决方案,则可以非常容易地使用PEP创建解决方案。 http://www.ling.ohio-state.edu/~scott/ – biziclop 2011-02-09 00:26:02

回答

6

您可以使用正则表达式:

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

+0

`user @ domain`验证了这一点。 `@`后面不需要点吗? – Adam 2011-02-09 01:05:19

+0

@亚当:这就是你的定义所表达的意思。要回答你的问题,在技术上,不。 – SLaks 2011-02-09 01:10:39

1

其实,The W3C Recommendation you've cited提供了一个正则表达式作为等价物,他们目前所为它定义了一个有效的电子邮件地址的ABNF:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][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 violationRFC 5322,所以他们有一个“借口”离开有效的情况下,但恕我直言,它不是接受无效地址的理由。

如果您不打扰那些异常情况,您可以使用W3C建议的正则表达式。否则,你应该使用正则表达式来覆盖你想要处理的情况。