2011-02-09 14 views
8

mi piacerebbe utilizzare la nuova <input type="email" /> elemento. Mi piacerebbe avere un codice Java che implementa la stessa validazione sul server che avviene nel browser.Esiste un'implementazione Java della convalida dell'email di input HTML5?

The HTML5 spec defines email addresses in ABNF come:

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. 
         "&"/"'"/
         "*"/"+"/
         "-"/"/"/
         "="/"?"/
         "^"/"_"/
         "`"/"{"/
         "|"/"}"/
         "~" 

Questi sono non le stesse regole come in 01.236.108,938 mila. Come posso verificare che un indirizzo sia conforme a queste regole in Java?

Grazie!

+0

non so se esiste una soluzione ready-made, ma se non è possibile trovare qualsiasi, è possibile abbastanza facilmente crearne uno con PEP. http://www.ling.ohio-state.edu/~scott/ – biziclop

risposta

6

È possibile utilizzare un espressione regolare:

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

+0

'user @ domain' convalida con quello. Non hai bisogno di un punto dopo il '@'? – Adam

+0

@Adam: questo è ciò che significa la tua definizione. Per rispondere alla tua domanda, tecnicamente, no. – SLaks

+0

Il mio male.'*' in ABNF include 0. – Adam

1

In realtà, The W3C Recommendation you've cited offre una regex come l'equivalente per quello che presentano come l'ABNF che definisce un indirizzo email valido:

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

Ma questa regex non valida indirizzi email, come ".any..indirizzo. @ 123" (testato con https://regex101.com/).

Questa espressione regolare accetta (tutti non validi in un indirizzo di posta elettronica, in base alle Wikipedia):

  • "" (Dot) all'inizio della parte locale
  • "" (Dot) alla fine della parte locale
  • sequenziale multipla "" (Punto) nella parte locale
  • solo numeri nella parte di dominio

e respinge (valido secondo Wikipedia):

  • caratteri Unicode
  • alcuni caratteri speciali delimitati con virgolette (")

Si noti che il W3C afferma che il specifica presentano è una willful violation di RFC 5322, in modo da avere una "scusa" per lasciare fuori i casi validi, ma secondo me non è un motivo per accettare indirizzi non validi.

Se non vuoi perdere tempo con questi casi di eccezione, è possibile utilizzare l'espressione regolare che suggerisce W3C. Altrimenti, dovresti lavorare la regex per coprire i casi che vuoi gestire.

+0

Non rifiuta tutti i caratteri non ASCII come dovrebbe essere eseguito nella versione di punycode, quindi 'example @ яндекс.рф' verrebbe prima convertito in' example @ xn - d1acpjx3f.xn - p1ai' che passa . Tuttavia, rifiuta gli indirizzi email validi con caratteri non ASCII prima di '@'. –