validar regular registro por expresion existe electronico cuenta correo contraseña como activar php regex email email-validation

regular - validar email php mysql



Cómo validar una dirección de correo electrónico en PHP (10)

Tengo esta función para validar una dirección de correo electrónico:

function validateEMAIL($EMAIL) { $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/"; return (bool)preg_match($v, $EMAIL); }

¿Está bien para verificar si la dirección de correo electrónico es válida o no?


Creo que será mejor que utilices los filters incorporados de PHP, en este caso particular:

Puede devolver un verdadero o falso cuando se suministra con el FILTER_VALIDATE_EMAIL .


En mi experiencia, las soluciones regex tienen demasiados falsos positivos y las soluciones de filter_var() tienen falsos negativos (especialmente con todos los TLDs más nuevos).

En su lugar, es mejor asegurarse de que la dirección tenga todas las partes necesarias de una dirección de correo electrónico (usuario, símbolo "@" y dominio), luego verifique que el dominio en sí existe.

No hay forma de determinar (lado del servidor) si existe un usuario de correo electrónico para un dominio externo.

Este es un método que creé en una clase de utilidad:

public static function validateEmail($email) { // SET INITIAL RETURN VARIABLES $emailIsValid = FALSE; // MAKE SURE AN EMPTY STRING WASN''T PASSED if (!empty($email)) { // GET EMAIL PARTS $domain = ltrim(stristr($email, ''@''), ''@'') . ''.''; $user = stristr($email, ''@'', TRUE); // VALIDATE EMAIL ADDRESS if ( !empty($user) && !empty($domain) && checkdnsrr($domain) ) {$emailIsValid = TRUE;} } // RETURN RESULT return $emailIsValid; }


Esto no solo validará su correo electrónico, sino que también lo desinfectará con caracteres inesperados:

$email = $_POST[''email'']; $emailB = filter_var($email, FILTER_SANITIZE_EMAIL); if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false || $emailB != $email ) { echo "This email adress isn''t valid!"; exit(0); }


La forma más fácil y segura de verificar si una dirección de correo electrónico está bien formada es usar la función filter_var() :

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // invalid emailaddress }

Además, puede verificar si el dominio define un registro MX :

if (!checkdnsrr($domain, ''MX'')) { // domain is not valid }

Pero esto aún no garantiza que el correo exista. La única manera de averiguarlo es enviando un correo de confirmación.

Ahora que tiene su respuesta fácil, no dude en leer sobre la validación de la dirección de correo electrónico si le interesa aprender o simplemente utilizar la respuesta rápida y continuar. Sin resentimientos.

Intentar validar una dirección de correo electrónico con una expresión regular es una tarea "imposible". Yo iría tan lejos como para decir que esa expresión regular que has hecho es inútil. Hay tres rfc con respecto a emailadresses y escribir una expresión regular para atrapar emailadresses incorrectos y, al mismo tiempo, no tener falsos positivos es algo que ningún mortal puede hacer. Consulte esta lista para ver las pruebas (tanto fallidas como filter_var() ) de la expresión regular utilizada por la función filter_var() PHP.

Incluso las funciones integradas de PHP, clientes de correo electrónico o servidores no funcionan bien. Aún en la mayoría de los casos, filter_var es la mejor opción.

Si desea saber qué patrón de expresiones regulares utiliza PHP (actualmente) para validar las direcciones de correo electrónico, consulte el origen de PHP .

Si desea obtener más información sobre las direcciones de correo electrónico, le sugiero que empiece a leer las especificaciones, pero debo advertirle que no es una lectura fácil de ningún tipo:

Tenga en cuenta que filter_var() es como ya se indicó solo disponible a partir de PHP 5.2. En caso de que quiera que funcione con versiones anteriores de PHP, puede usar la expresión regular utilizada en PHP:

<?php $pattern = ''/^(?!(?:(?://x22?//x5C[//x00-//x7E]//x22?)|(?://x22?[^//x5C//x22]//x22?)){255,})(?!(?:(?://x22?//x5C[//x00-//x7E]//x22?)|(?://x22?[^//x5C//x22]//x22?)){65,}@)(?:(?:[//x21//x23-//x27//x2A//x2B//x2D//x2F-//x39//x3D//x3F//x5E-//x7E]+)|(?://x22(?:[//x01-//x08//x0B//x0C//x0E-//x1F//x21//x23-//x5B//x5D-//x7F]|(?://x5C[//x00-//x7F]))*//x22))(?://.(?:(?:[//x21//x23-//x27//x2A//x2B//x2D//x2F-//x39//x3D//x3F//x5E-//x7E]+)|(?://x22(?:[//x01-//x08//x0B//x0C//x0E-//x1F//x21//x23-//x5B//x5D-//x7F]|(?://x5C[//x00-//x7F]))*//x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*//.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?://[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][://]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?://.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))//]))$/iD''; $emailaddress = ''[email protected]''; if (preg_match($pattern, $emailaddress) === 1) { // emailaddress is valid }

PS Una nota sobre el patrón de expresiones regulares utilizado anteriormente (de la fuente PHP). Parece que hay algunos derechos de autor de Michael Rushton . Como se dijo: "Siéntase libre de usar y redistribuir este código. Pero conserve este aviso de copyright".


Mientras realizaba algunas pruebas esta mañana, descubrí que FILTER_VALIDATE_EMAIL validará [email protected] como una dirección de correo electrónico válida.

$counter = 0; foreach($emails as $email){ $email = trim($email); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { unset($emails[$counter]); } $counter++; }

Alguien tiene una recomendación para abordar esto?


Puedes usar filter_var para esto.

<?php function validateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL); } ?>


Respondió esto en la ''pregunta principal'' sobre la verificación de correos electrónicos https://.com/a/41129750/1848217

Para mí, la forma correcta de verificar los correos electrónicos es:

  1. Compruebe que exista el símbolo @, y antes y después hay algunos símbolos que no son @: /^[^@]+@[^@]+$/
  2. Intenta enviar un correo electrónico a esta dirección con un "código de activación".
  3. Cuando el usuario "activó" su dirección de correo electrónico, veremos que todo está bien.

Por supuesto, puede mostrar una advertencia o mensaje de ayuda en el front-end cuando el usuario escribió un correo electrónico "extraño" para ayudarlo a evitar errores comunes, como no tener un punto en el dominio o espacios en el nombre sin citar y así sucesivamente. Pero debe aceptar la dirección "hello @ world" si el usuario realmente lo quiere.

Además, debe recordar que el estándar de dirección de correo electrónico era y puede evolucionar, por lo que no puede simplemente escribir alguna expresión regular de "validez estándar" una vez y para siempre. Y debe recordar que algunos servidores de Internet concretos pueden fallar algunos detalles del estándar común y, de hecho, funcionan con su propio "estándar modificado".

Por lo tanto, solo marque @, indique usuario en la interfaz y envíe correos electrónicos de verificación a la dirección especificada.


Si desea verificar si el dominio proporcionado de la dirección de correo electrónico es válido, use algo como:

/* * Check for valid MX record for given email domain */ if(!function_exists(''check_email_domain'')){ function check_email_domain($email) { //Get host name from email and check if it is valid $email_host = explode("@", $email); //Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322) $host = end($email_host) . "."; //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php) return checkdnsrr(idn_to_ascii($host), "MX"); //(bool) } }

Esta es una manera práctica de filtrar muchas direcciones de correo electrónico no válidas, junto con la validación de correo electrónico estándar, ya que un formato de correo electrónico válido no significa un correo electrónico válido.

Tenga en cuenta que la función idn_to_ascii() (o su función hermana idn_to_utf8() ) puede no estar disponible en su instalación PHP, requiere extensiones PECL intl> = 1.0.2 y PECL idn> = 0.1.

También tenga en cuenta que IPv4 o IPv6 como parte del dominio en el correo electrónico (por ejemplo, user@[IPv6:2001:db8::1] ) no se pueden validar, solo los hosts con nombre pueden hacerlo.

Ver más here .


Si solo está buscando una expresión regular real que permita varios puntos, guiones bajos y guiones, de la siguiente manera: [a-zA-z0-9.-]+/@[a-zA-z0-9.-]+.[a-zA-Z]+ . Eso permitirá validar un correo electrónico bastante estúpido como tom_anderson.1-neo@my-mail_matrix.com .