Validación de correo electrónico HTML5


102

Se dice "Con HTML5, no necesitamos más js o un código del lado del servidor para verificar si la entrada del usuario es una dirección de correo electrónico o URL válida".

¿Cómo puedo validar el correo electrónico después de que ingrese un usuario? y sin JS cómo mostrar un mensaje si el usuario ingresa una forma incorrecta de su dirección de correo electrónico.

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

50
Siempre es necesario validar en el lado del servidor. Un cliente inteligente puede evitar cualquier medida de seguridad del lado del cliente.
Benjamin Gruenbaum

Esta respuesta puede resultar útil al intentar configurar la validación de formularios HTML5. Por supuesto, probablemente aún necesitaría la validación del lado del servidor.
Joeytje50

2
La validación de correo electrónico regex nunca debe usarse bajo ninguna circunstancia. Las comprobaciones de expresiones regulares tienen demasiados defectos. La mejor manera de "validar" una dirección de correo electrónico es simplemente hacer que la escriban dos veces y ejecutar una verificación Regex que advierte al usuario que no parece una dirección de correo electrónico válida si no coincide con el patrón, y pide al usuario que vuelva a comprobar. De esta manera, si realmente es válido, pero la expresión regular está fallando (como sucede con tanta frecuencia), el usuario puede simplemente reconocer que sabe que es válido y continuar. Demasiados sitios usan la validación de expresiones regulares y es frustrante para muchos usuarios.
Soundfx4


Pedirle al usuario que ingrese la misma dirección de correo electrónico dos veces es inútil. Si no conoce su dirección de correo electrónico, pedir que la escriba dos veces no mejora las probabilidades. Si conocen su dirección de correo electrónico, pedir que la escriban dos veces es una mala interfaz de usuario.
Mikko Rantalainen

Respuestas:


120

En HTML5 puedes hacer esto:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

Y cuando el usuario presiona enviar, automáticamente muestra un mensaje de error como:

Mensaje de error


3
¿Cuál es el beneficio del patrón aquí? Especificar el tipo como correo electrónico ya incluye un patrón integrado para determinar esto.
Rich Bradshaw

3
@RichBradshaw: Sí, tienes razón. No es necesario especificar el patrón (acabo de copiar el código de OP, lo corregí ahora :))
Midhun MP

6
@MichaelDeMutis: Puede usar el requiredatributo
Midhun MP

29
el correo electrónico no se comprueba .comen un correo electrónico. Solo marca el signo @. Ex. Puedo ingresar example@gmaily guardar el formulario. aunque no es una dirección de correo electrónico válida. ¿Existe alguna solución alternativa para comprobarlo correctamente example@gmail.com?
Ruchika

9
@Liz. example@gmailPuede que no sea un correo electrónico válido, pero es un formato de dirección de correo electrónico válido.
pajaja

47

La input type=emailpágina del sitio www.w3.org señala que una dirección de correo electrónico es cualquier cadena que coincida con la siguiente expresión regular:

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

Utilice el requiredatributo y un patternatributo para requerir que el valor coincida con el patrón de expresiones regulares.

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>

14
Debe insertar el patrón sin los dos '/' y el símbolo de inicio '^' y final '$'. Como estos[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Victor

4
@Victor Lo siento, pero estás parcialmente equivocado. Estos símbolos son importantes sin ellos, el patrón comenzará a coincidir en todas partes de la cadena y la hará inútil. Donde estás en lo correcto es dejando las barras.
Hexodus

@Victor, tu respuesta me funcionó. La expresión regular de OP me dio un falso positivo diciendo que coincidía con los requisitos del formulario, incluso cuando es una dirección de correo electrónico válida. Quizás es que no estoy usando HTML normal, sino que estoy usando React JS para renderizar el formulario HTML.
Ka Mok

Casi voté en contra de esto porque la respuesta correcta es usar type="email"y verificar la validpropiedad booleana en el DOMNode, no es necesario repetir la expresión regular subyacente
Dominic

Gracias por mencionar esto.
Stefan Ciprian Hotoleanu

17

Utilizando [a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}para somemail@email.com/somemail@email.com.vn


4
Esta expresión regular impone una serie de requisitos inapropiados a las direcciones de correo electrónico; por ejemplo, rechaza las direcciones de correo electrónico que tienen un nombre de usuario de una o dos letras, o que están alojadas en un nombre de dominio de una letra.
anochecer-inactivo-

Editado. Gracias @duskwuff
Van Nguyen

Aún rechaza los nombres de dominio de una letra.
anochecer-inactivo-

Esto permite dominios de 1 letra / número: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
Timón

También tenga en cuenta que, por ejemplo, postmaster@aies una dirección de correo electrónico válida y esta expresión regular también prohibiría eso. (Fuente: serverfault.com/q/154991/104798 )
Mikko Rantalainen

12
document.getElementById("email").validity.valid

parece ser cierto cuando el campo está vacío o es válido. Esto también tiene algunas otras banderas interesantes:

ingrese la descripción de la imagen aquí

Probado en Chrome.


8

Este es el ejemplo que utilizo para todas las entradas de correo electrónico de mi formulario. Este ejemplo es ASP.NET, pero se aplica a cualquiera:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: xxx@xxx.xxx)" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

HTML5 todavía valida el uso del patrón cuando no es necesario. Aún no he encontrado uno que sea un falso positivo.

Esto se representa como el siguiente HTML:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: xxx@xxx.xxx)" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">

7

Sé que no buscas la solución de Javascript, sin embargo, hay algunas cosas, como el mensaje de validación personalizado, que, según mi experiencia, solo se puede hacer con JS.

Además, al usar JS, puede agregar dinámicamente la validación a todos los campos de entrada de tipo correo electrónico dentro de su sitio en lugar de tener que modificar cada campo de entrada.

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})

Por favor, no solo publique respuestas de enlaces. Simplemente coloque las partes esenciales del enlace en su respuesta
Rizier123

4

Un poco tarde para la fiesta, pero esta expresión regular me ayudó a validar la entrada del tipo de correo electrónico en el lado del cliente. Sin embargo, siempre debemos hacer la verificación en el lado del servidor también.

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

Puede encontrar más expresiones regulares de todo tipo aquí .


4

TL; DR: El único método 100% correcto es buscar @ -sign en algún lugar de la dirección de correo electrónico ingresada y luego publicar un mensaje de validación en la dirección de correo electrónico dada. Si pueden seguir las instrucciones de validación en el mensaje de correo electrónico , la dirección de correo electrónico ingresada es correcta.

Respuesta larga:

David Gilbertson escribió sobre esto hace años:

Hay dos preguntas que debemos hacer:

  1. ¿Entendió el usuario que se suponía que debía escribir una dirección de correo electrónico en este campo?
  2. ¿El usuario escribió correctamente su propia dirección de correo electrónico en este campo?

Si tiene un formulario bien diseñado con una etiqueta que dice "correo electrónico" y el usuario ingresa un símbolo '@' en alguna parte, entonces es seguro decir que entendió que se suponía que debía ingresar una dirección de correo electrónico. Fácil.

A continuación, queremos hacer una validación para determinar si ingresaron correctamente su dirección de correo electrónico.

Imposible.

[...]

Cualquier mistype será sin duda resultará en una incorrecta dirección de correo electrónico, pero sólo tal vez dar lugar a un inválidos dirección de correo electrónico.

[...]

No tiene sentido intentar averiguar si una dirección de correo electrónico es "válida". Es mucho más probable que un usuario ingrese una dirección de correo electrónico incorrecta y válida que que ingrese una no válida .

En otras palabras, es importante tener en cuenta que cualquier tipo de validación basada en cadenas solo puede verificar si la sintaxis no es válida. No puede verificar si el usuario realmente puede ver el correo electrónico (por ejemplo, porque el usuario ya perdió las credenciales, la dirección escrita de otra persona o el correo electrónico del trabajo en lugar de la dirección de correo electrónico personal para un caso de uso determinado). ¿Con qué frecuencia la pregunta que realmente busca es " este correo electrónico es sintácticamente válido " en lugar de " puedo comunicarme con el usuario usando la dirección de correo electrónico dada "? Si valida la cadena más de "¿contiene @", está tratando de responder la pregunta anterior! Personalmente, siempre estoy interesa la última pregunta únicamente.

Además, algunas direcciones de correo electrónico que pueden ser sintáctica o políticamente inválidas funcionan. Por ejemplo, postmaster@aitécnicamente funciona aunque los TLD no deberían tener registros MX . También vea la discusión sobre la validación de correo electrónico en la lista de correo WHATWG (donde HTML5 está diseñado en primer lugar).


2

Usando HTML 5, simplemente haga que el correo electrónico de entrada sea como:

<input type="email"/>

Cuando el usuario se desplaza sobre el cuadro de entrada, aparecerá una información sobre herramientas indicándole que ingrese un correo electrónico válido. Sin embargo, los formularios Bootstrap tienen un mensaje de información sobre herramientas mucho mejor para decirle al usuario que ingrese una dirección de correo electrónico y aparece en el momento en que el valor ingresado no coincide con un correo electrónico válido.


Pero esto no invalida casos como "abc @ gmail".
nbsamar

sí, creo que sí, me gustaría validar si el usuario pone gmail o hotmail, por ejemplo, si mi usuario pone otro, entonces no le dejo continuar con mi inicio de sesión, ¿sabe cómo puedo hacer eso?
Simon

2

Puedes seguir este patrón también

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

Ref: En W3Schools


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">también puede agregar un título para mostrar un mensaje de validez.
imdzeeshan

1

Según MDN , esta RegExp está bien para validar correos electrónicos, ya que los correos electrónicos que cumplen con las especificaciones deben coincidir.

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

0

Es muy difícil validar el correo electrónico correctamente simplemente usando el atributo HTML5 "patrón". Si no utiliza un "patrón", alguien @ será procesado. que NO es un correo electrónico válido.

El uso pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"requerirá que el formato sea, someone@email.comsin embargo, si el remitente tiene un formato como someone@email.net.au(o similar) no se validará para solucionarlo, puede colocarpattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" esto validará ".com.au o .net.au o similar.

Sin embargo, al usar esto, no permitirá que someone@email.com valide. Entonces, en cuanto a simplemente usar HTML5 para validar direcciones de correo electrónico, todavía no está del todo con nosotros. Para completar esto, usaría algo como esto:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

o:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

Sin embargo, no sé cómo validar ambas o todas las versiones de direcciones de correo electrónico utilizando el atributo de patrón HTML5.


1
Las comprobaciones de expresiones regulares nunca deben usarse bajo ninguna circunstancia. Hay demasiados patrones y tienen demasiados defectos. Por ejemplo, someone+customwordhere@email.com se considera inválido para muchas verificaciones de expresiones regulares cuando, de hecho, es 100% válido. Regex es una espina clavada en el costado de muchos otros usuarios y tiene que irse. Se debe utilizar un método alternativo para garantizar que un usuario ingrese una dirección de correo electrónico válida.
Soundfx4

También tenga en cuenta que, por ejemplo, postmaster@aies una dirección de correo electrónico válida y esta expresión regular también prohibiría eso. (Fuente: serverfault.com/q/154991/104798 )
Mikko Rantalainen

La herramienta de validación de correo electrónico como DeBounce también se recomienda junto con HTML5.
Iman Hejazi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.