2011-02-09 8 views
8

Me gustaría utilizar el nuevo elemento <input type="email" />. Me gustaría tener un código Java que implemente la misma validación en el servidor que ocurre en el navegador.¿Hay una implementación de Java de la validación de correo electrónico de entrada de HTML5?

The HTML5 spec defines email addresses en ABNF como:

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

Estos son no las mismas reglas que en RFC 5322. ¿Cómo puedo probar que una dirección cumple con estas reglas en Java?

Gracias!

+0

No sé si existe una solución preparada, pero si no puede encontrar ninguna, puede crear fácilmente una con PEP. http://www.ling.ohio-state.edu/~scott/ – biziclop

Respuesta

6

Se puede utilizar una expresión regular:

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

+0

'user @ domain' valida con eso. ¿No necesitas un punto después de '@'? – Adam

+0

@ Adam: Esto es lo que significa su definición. Para responder a su pregunta, técnicamente, no. – SLaks

+0

Mi mal.'*' en ABNF incluye 0. – Adam

1

En realidad, The W3C Recommendation you've cited ofrece una expresión regular como el equivalente de lo que ellos presentan como el ABNF que define una dirección de correo electrónico válida:

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

Pero esta expresión coincide con inválida direcciones de correo electrónico, como ".any..address. @ 123" (probado con https://regex101.com/).

Esta expresión regular acepta (no válido en toda una dirección de correo electrónico, de acuerdo con Wikipedia):

  • "" (punto) al comienzo de la parte local
  • "." (punto) al final de la parte local
  • secuencia múltiple "." (Punto) en la parte local
  • sólo los números de parte de dominio

y rechaza (válido según la Wikipedia):

  • caracteres Unicode
  • algunos caracteres especiales delimitadas con comillas (")

Observe que W3C afirma que el especificación que presentan es un willful violation de RFC 5322, por lo que tienen una "excusa" para dejar fuera de los casos válidos, pero en mi humilde opinión no es una razón para aceptar direcciones no válidas.

Si no se molesta con esos casos excepcionales, puede usar la expresión regular que sugiere el W3C. De lo contrario, debe trabajar la expresión regular para cubrir los casos que desea manejar.

+0

No rechaza todos los caracteres que no son ASCII, ya que se supone que debe ejecutarse en la versión de punycode, por lo que 'example @ яндекс.рф' se convertiría primero en' example @ xn - d1acpjx3f.xn - p1ai', que pasa . Sin embargo, rechaza las direcciones de correo electrónico válidas con caracteres que no sean ASCII antes del '@'. –

Cuestiones relacionadas