A maneira mais fácil e segura de verificar se um endereço de e-mail está bem formado é usar a filter_var()
função:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
Além disso, você pode verificar se o domínio define um MX
registro:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
Mas isso ainda não garante que o correio existe. A única maneira de descobrir isso é enviando um email de confirmação.
Agora que você tem sua resposta fácil, sinta-se à vontade para ler sobre a validação de endereço de e-mail, se quiser aprender ou simplesmente usar a resposta rápida e seguir em frente. Sem ressentimentos.
Tentar validar um endereço de email usando uma regex é uma tarefa "impossível". Eu diria que esse regex que você fez é inútil. Existem três rfc em relação a endereços de email e escrever um regex para capturar endereço de email errado e, ao mesmo tempo, não ter falsos positivos, é algo que nenhum mortal pode fazer. Confira esta lista para testes (com falha e com êxito) do regex usado pela filter_var()
função do PHP .
Mesmo as funções embutidas do PHP, clientes ou servidores de email não acertam. Ainda na maioria dos casos, filter_var
é a melhor opção.
Se você deseja saber qual padrão de expressão regular o PHP (atualmente) usa para validar endereços de email, consulte a fonte do PHP .
Se você quiser saber mais sobre endereços de e-mail, sugiro que você comece a ler as especificações, mas tenho que avisar que não é uma leitura fácil, de forma alguma:
Note que isso filter_var()
já está disponível apenas a partir do PHP 5.2. Caso você queira que ele funcione com versões anteriores do PHP, você pode usar o regex usado no 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 = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
PS Uma observação sobre o padrão regex usado acima (da fonte PHP). Parece que existem alguns direitos autorais de Michael Rushton . Como afirmado: "Sinta-se livre para usar e redistribuir este código. Mas mantenha este aviso de direitos autorais".
validateEmail
seria correto, além de passageiro$email
, não$EMAIL
.