2011-02-09 69 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建議的正則表達式。否則,你應該使用正則表達式來覆蓋你想要處理的情況。