Pregunta ¿Por qué la validación de formularios HTML5 permite correos electrónicos sin un punto?


Estoy escribiendo una maqueta muy simple para demostrar algo de validación de formularios HTML5. Sin embargo, noté que la validación del correo electrónico no marca un punto en la dirección, ni tampoco los caracteres que siguen a dicho punto.

En otras palabras, "john @ doe" se considera válido, cuando claramente no es una dirección de correo electrónico válida; "doe" no es un dominio.

Así es como estoy codificando mi campo de correo electrónico:

<input type="email" required />

¿No es eso suficiente?

Mira esto violín para ver lo que quiero decir

Nota: Sé cómo lograr esto a través de un patrón RegEx en su lugar. Me pregunto cómo alguien podría salirse con la suya usando el tipo de correo electrónico.


73
2017-12-13 18:29


origen


Respuestas:


Porque a @ b es una dirección de correo electrónico válida (por ejemplo, localhost es un dominio válido). Ver http://en.wikipedia.org/wiki/Email_address#Examples

Además, tenga en cuenta que siempre debe hacer la validación de entrada en el servidor. La validación del lado del cliente debe ser solo para dar retroalimentación al usuario y no depender de ella, ya que se puede omitir fácilmente.


39
2017-12-13 18:47



En teoría, puede tener una dirección sin un "." en.

Desde el punto de vista técnico, cosas como:

user@com
user@localserver
user@[IPv6:2001:db8::1]

Son todos los correos electrónicos válidos.

Por lo tanto, la validación estándar de HTML5 permite todos los correos electrónicos válidos, incluidos los poco comunes.

Para algunas explicaciones fáciles de leer (en lugar de leer los estándares): http://en.wikipedia.org/wiki/Email_address#Examples


106
2017-12-13 18:37



Intenta agregar esto a la entrada

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

Violín


34
2017-12-13 18:31



los RFC 822, capítulo 6, da la especificación de una dirección en forma de Backus-Naur aumentada (BNF):

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

Usando esta especificación a@b es una dirección válida.

ACTUALIZAR

Para responder el comentario de Trejkaz, agrego las siguientes definiciones. Vemos que el ESPACIO está permitido, pero solo en la secuencia citada.

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  

11
2018-01-24 10:50



Puede personalizar el patrón del campo de correo electrónico:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />


2
2018-04-26 00:04



En esta página de MDN muestra que los navegadores de expresiones regulares deberían usar para validar el correo electrónico:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

Puede cambiar ligeramente esta expresión regular para requerir al menos un punto en el nombre de dominio: cambie la estrella * al final de la expresión regular a un plus +. Luego usa esa expresión regular como pattern atributo:

<input type="email" pattern="^[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])?)+$"></input>

1
2017-07-02 15:29



Este patrón siempre me funciona.

El texto debe estar en minúsculas pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" pero creo que cubre más o menos la mayoría de los correos electrónicos.


-3
2018-04-27 11:12



Esto responde la pregunta.

/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

-3
2018-01-29 13:53