2009-06-15 10 views
9

Duplicar posibles:
What is the best regular expression for validating email addresses?Email expresión regular

duplicado: What is the best regular expression for validating email addresses?

Sé que esto es una pregunta común, pero todavía parece que no puede encontrar una gran expresión regular para usar al validar direcciones de correo electrónico.

Realmente no tengo tiempo para leer las especificaciones y escribir las mías. ¿Qué has usado antes y ha funcionado bien? Realmente no me importa el 100% que coincida con la especificación, pero cuanto más cerca, mejor.

+0

Hay muchas preguntas acerca de la expresión regular de correo electrónico. http://stackoverflow.com/questions/508108/regex-for-email-validation-closed – Macarse

Respuesta

13

Aquí es una función que yo uso. Se hace un poco más que simplemente ejecuta la dirección de correo electrónico a través de una expresión regular, pero hasta el momento es la solución más completa que he encontrado:

function validEmail($email, $skipDNS = false) 
{ 
    $isValid = true; 
    $atIndex = strrpos($email, "@"); 
    if (is_bool($atIndex) && !$atIndex) 
    { 
     $isValid = false; 
    } 
    else 
    { 
     $domain = substr($email, $atIndex+1); 
     $local = substr($email, 0, $atIndex); 
     $localLen = strlen($local); 
     $domainLen = strlen($domain); 
     if ($localLen < 1 || $localLen > 64) 
     { 
     // local part length exceeded 
     $isValid = false; 
     } 
     else if ($domainLen < 1 || $domainLen > 255) 
     { 
     // domain part length exceeded 
     $isValid = false; 
     } 
     else if ($local[0] == '.' || $local[$localLen-1] == '.') 
     { 
     // local part starts or ends with '.' 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $local)) 
     { 
     // local part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) 
     { 
     // character not valid in domain part 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $domain)) 
     { 
     // domain part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) 
     { 
     // character not valid in local part unless 
     // local part is quoted 
     if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) 
     { 
      $isValid = false; 
     } 
     } 

     if(!$skipDNS) 
     { 
      if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) 
      { 
      // domain not found in DNS 
      $isValid = false; 
      } 
     } 
    } 
    return $isValid; 
} 

La función tiene un opcional $ skipDNS argumento que se puede establecer a VERDADERO si no quiere validar los registros MX de la hos. De lo contrario, la función intentará validar que la dirección de correo electrónico proporcionada realmente se asigna a un servidor de correo electrónico real.

Es útil tener en cuenta que la mayoría de las técnicas de validación de correo electrónico de RegEx validarán la mayoría de las direcciones de correo electrónico, pero lo más probable es que permitan algunas direcciones inválidas cuidadosamente elaboradas o peores ... fallan en direcciones de correo electrónico más oscuras pero válidas. Para obtener más información, puede consultar el Internet Message Formats RFC que describe el formato permitido para las direcciones de correo electrónico.

+0

Comprobando los registros DNS ... ¡buen enfoque! –

+0

Esto también es algo vulnerable a REDOS. Vea un exploit relacionado aquí: https://github.com/johnhenry/valid-email/issues/4 –

12
^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ 

Esta es una herramienta increíble para ayudar a escribir y comprobar la expresión, no estoy seguro si la tienes pero espero que sea útil.

Expresso

+2

Esta expresión regular es una forma segura de inducir un retroceso catastrófico, como lo demuestra [esta pregunta de seguimiento] (http: //stackoverflow.com/q/13087755/20670). –

+1

No use esto - vea: http://stackoverflow.com/questions/13087755/can-anyone-tell-me-why-this-c-sharp-email-validation-regular-expression-regex –

+0

'Herramienta impresionante 'no advierte sobre retrocesos catastróficos. No estoy seguro si RegexBuddy sí, pero es mi herramienta de elección. –