Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Validando direcciones de email con expresiones regulares

21 de junio de 2013

Durante los últimos años he perfeccionado una expresión regular que valida la mayoría de direcciones de correo electrónico. Su única limitación es que no valida los emails que utilizan direcciones IP en la parte del servidor. Ahora mismo esta expresión regular es:

^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$

Utilizo esta expresión regular en varias aplicaciones PHP y funciona casi siempre. No obstante, de vez en cuando recibo peticiones de gente que la utiliza en sus propias aplicaciones y que tiene problemas con ella. De hecho, hace poco tuve que hacer un ajuste para permitir los dominios de cuatro letras.

Así que mi pregunta es, ¿cuál es la mejor expresión regular que conocéis para validar emails?

He visto algunas soluciones que utilizan muchas funciones que a su vez definen expresiones regulares muy pequeñas y luego lo encadenan todo. Pero yo prefiero tener una única función sencilla que aplique una sola expresión regular, aunque esta sea muy compleja.


Estás leyendo una traducción autorizada de la pregunta Using a regular expression to validate an email address planteada por acrosman en StackOverflow.


Respuestas

#1

Lamentablemente no existe una expresión regular sencilla capaz de validar emails. Puedes echar un vistazo por ejemplo a esta monstruosa expresión regular de Perl que valida cualquier dirección correcta de acuerdo con el estándar RFC‑822.

El principal problema es que el estándar RFC 5322 define una gramática demasiado compleja como para transformarla en expresiones regulares simples. Aunque puedes crear una expresión regular para Perl, PCRE y PHP, el resultado siempre será bastante complejo.

En cualquier caso, ten en cuenta que aunque llegaras a crear una expresión regular más o menos simple, no te serviría de nada. Esta expresión sólo te diría si el email tiene un aspecto correcto según el estándar, pero no te asegura que la dirección exista y tampoco que su dueño sea el usuario que la ha escrito. Así que en la práctica, la mejor solución siempre consiste en enviar un email de confirmación a la dirección de correo indicada.

Si aún así prefieres utilizar una librería para validar las direcciones de correo electrónico, estas dos te pueden servir:

  • EmailValidator, librería PHP que se utiliza en el famoso framework Symfony.
  • mailcheck, librería JavaScript que detecta la mayoría de errores al escribir direcciones de correo de los servicios más populares de Internet. Esto evita que la gente escriba [email protected] en vez de [email protected], etc.

@librosweb

18 septiembre 2014, 23:01
#2

Yo al final tras tener muchos problemas he decidido validar los correos de la forma más simple posible, tan solo compruebo que el correo tenga una arroba y al menos un punto. Después solo te queda confiar en que el usuario no se equivoca al introducirla ya que después de probar a modificar miles de veces mi expresión regular, siempre te encuentras con un correo que debería entrar y no entra. He comprobado que al final validar los correos con una expresión regular me creaba más dolores de cabeza que usuarios que la introducen incorrectamente y hay que modificársela. Pero como todo, allá cada uno.

@apanamechas

15 enero 2017, 20:58
#3

[email protected] este correo electrónico es aceptable para la expresión regular que han establecido, para lo cual me parece incorrecto, debido a que debo terminar con un . y el subdominio.

@_KarlaAO

22 enero 2017, 11:09