2008-10-02 13 views
7

Necesito validar la dirección de correo electrónico de mis usuarios. Por desgracia, lo que hace un validador que comforms to standards es difícil¿Hay una biblioteca php para la validación de la dirección de correo electrónico?

Here es un ejemplo de una expresión de expresiones regulares que trata de comform la norma

¿Hay alguna librería PHP (preferentemente, de código abierto) que valida la dirección de correo electrónico?

+0

¿estamos hablando de correos electrónicos o direcciones de correo electrónico? – Sietse

+0

Quise decir la dirección de correo electrónico. He corregido mi pregunta para reflejar eso. Gracias – MrValdez

Respuesta

16

¿Has mirado PHP's filter_ functions? No son perfectos, pero hacen un trabajo bastante decente en mi experiencia.

Ejemplo de uso (retornos booleano):

filter_var($someEmail, FILTER_VALIDATE_EMAIL);

+0

Estoy codificando una aplicación simple (no Enterprise) que necesita un validador básico. Aunque FILTER_VALIDATE_EMAIL no parece implementar completamente la especificación, por ejemplo, falla algunas de las pruebas en http://code.iamcal.com/php/rfc822/rfc822.phps, parece ser "lo suficientemente bueno" para mis necesidades actuales ¡Gracias! –

12

yo sepa, la única buena manera de validar un correo electrónico es enviar un correo electrónico y ver si el usuario vuelve al sitio usando un enlace en este correo electrónico. Eso es lo que hacen muchos sitios.

Como usted señala con el enlace a la bien conocida mamut regex, la validación de todas las formas de dirección de correo electrónico es difícil, casi imposible. Es tan fácil hacerlo mal, incluso para correos electrónicos de estilo trivial (¡encontré demasiados sitios rechazando límites en las direcciones de correo electrónico! ¡Y la mayoría de los regex antiguos rechazan los TLD de más de 4 letras!).

AFAIK, "Jean-Luc B. O'Grady" @ example.com y e = mc^2 @ [82.128.45.117] son ​​direcciones válidas ... Mientras que I-Made-It-Up @ Absurd- Domain-Name.info es probable que no sea válido.

Así que, de alguna manera, simplemente verificaría que tenemos algo único, @, algo más, e iríamos: atraparía la mayoría de los errores del usuario (como campo vacío o nombre de usuario en lugar de dirección de correo electrónico).
Si el usuario quiere dar una dirección falsa, simplemente daría una apariencia aleatoria correcta ([email protected] o [email protected]). Y ningún validador detectará los errores tipográficos ([email protected] en lugar de [email protected]).

Si realmente quiere validar correos electrónicos contra RFC completo, le aconsejo utilizar expresiones regulares para dividir @, luego verifique por separado el nombre local y el nombre de dominio. Separa el caso del nombre local comenzando con "de otros casos, etc. Separa el caso del nombre de dominio comenzando con [de otros casos, etc. Dividir el problema en dominios específicos más pequeños, y usar expresiones regulares solo en casos más simples, bien definidos.
Esto consejos se puede aplicar a gran cantidad de usos de expresiones regulares, por supuesto ...

+0

Esa es una respuesta válida y lo que normalmente haría. Pero para este cliente en particular, necesitaba una forma de verificar si un correo electrónico es válido. La alternativa a la validación de correo electrónico es pedirle al usuario que ingrese sus correos electrónicos dos veces, lo que no puedo refutar. Con suerte, puedo convencerlos de que no hagan esto. – MrValdez

+0

¿Qué pasa con la doble entrada? Es una manera rápida, barata y fácil de garantizar que el usuario no toque su dirección de correo electrónico mientras la escribe. Si realmente necesita verificar que una dirección de correo electrónico tenga un formato válido, la respuesta de Dominic (y sus enlaces) sitio) parece contener la información más completa que he visto hasta ahora. – afrazier

+2

@afrazier: "¿Qué pasa con la doble entrada?" Bueno, si la gente me quiere, simplemente copia/pega la primera entrada en la segunda, por lo que el beneficio es nulo ... – PhiLho

1

Zend_Validate incluye un validador de correo electrónico

Hay un montón de expresiones regulares alrededor de validación -.. todo, desde lo más básico hasta muy avanzada realmente debe elegir algo que coincida con la importancia de un correo electrónico válido en su aplicación.

0

recomendaría ver el código fuente de Zend_Validate_EmailAddress [source].

una vez que haya solucionado sus dependencias se puede simplemente hacer lo siguiente:

$mail_validator = new Zend_Validate_EmailAddress(); 
$mail_validator->isValid($address); // returns true or false 

mejor sería obtener la biblioteca completa de Zend en su proyecto a través de SVN externa y señalar el camino de incluir a ella ...

pero que acaba de descargar los archivos necesarios (1, 2, 3, 4, 5, 6), y todos ellos incluyen (quitar las llamadas require_once)

8

Cal Henderson (de Flickr) escribió un RFC822 compliant email address matcher, con una explicación del RFC y el código que utiliza el RFC para hacer coincidir las direcciones de correo electrónico. Lo he usado desde hace bastante tiempo sin quejas.

RFC822 (publicado en 1982) define, entre otras cosas, el formato de mensaje de texto internet (correo electrónico) direcciones. Puede encontrar el RFC por googleando - hay muchas copias de en línea. Son un poco escuetos y formateados extrañamente, pero con un pequeño esfuerzo podemos ver lo que están obteniendo.

... Actualización ...

Como Porges señaló en los comentarios, la biblioteca en el enlace es anticuado, pero esa página tiene un enlace a updated version.

+0

Bien, gracias por el enlace. –

+0

Vale la pena señalar que RFC822 es antiguo, ya que la cita identifica. De hecho, el RFC que obsoleta 822 (2822) es * también * obsoleto, lo que le muestra lo anticuado que está :) El RFC actual para las direcciones de correo electrónico es 5322, ¡publicado el mes de esta respuesta! – porges

10

[ACTUALIZADO] He recopilado todo lo que sé sobre la validación de la dirección de correo electrónico aquí: http://isemail.info, que ahora no solo valida sino que también diagnostica problemas con las direcciones de correo electrónico. Estoy de acuerdo con muchos de los comentarios aquí que la validación es solo una parte de la respuesta; ver mi ensayo al http://isemail.info/about.

He cotejado casos de prueba de Cal Henderson, Dave Child, Phil Haack, Doug Lovell y RFC 3696. 158 direcciones de prueba en total.

Realicé todas estas pruebas contra todos los validadores que pude encontrar. La comparación está aquí: http://www.dominicsayers.com/isemail

Intentaré mantener esta página actualizada a medida que las personas mejoran sus validadores. Gracias a Cal, Dave y Phil por su ayuda y cooperación en la compilación de estas pruebas y críticas constructivas de my own validator.

La gente debe conocer el errata against RFC 3696 en particular. Tres de los ejemplos canónicos son, de hecho, direcciones inválidas. Y la longitud máxima de una dirección es 254 o 256 caracteres, no 320.

+0

Gracias por hacer esto; es increíble tener datos reales para trabajar, en lugar de solo especulaciones. ¿También puede incluir las otras bibliotecas mencionadas en esta página? – Anirvan

Cuestiones relacionadas