Como validar um endereço de E-mail em PHP
Tenho esta função para validar um endereço de E-mail:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
Pode verificar se o endereço de E-mail é válido ou não?
9 answers
filter_var()
função:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
Para além disso, poderá verificar se o domínio define um registo MX
:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
Mas isto não garante que o correio exista. A única maneira de descobrir isso é enviando um e-mail de confirmação.
Agora que já tem a sua resposta fácil, sinta-se à vontade para ler sobre a validação do endereço de E-mail se quiser aprender ou não. basta usar a resposta rápida e seguir em frente. Sem ressentimentos.
Tentar validar um endereço de E-mail usando uma expressão regular é uma tarefa "impossível". Eu diria que esse regex que você fez é inútil. Há três rfc a respeito de emailadresses e escrever um regex para pegar emailadresses errados e, ao mesmo tempo, não ter falsos positivos é algo que nenhum mortal pode fazer. Confira esta lista para testes (ambos falhados e bem-sucedidos) da regex usada pelo PHP filter_var()
funcao.
Mesmo as funções PHP incorporadas, os clientes de E-mail ou os servidores não entendem bem. Ainda na maioria dos casos filter_var
é a melhor opção.
Se quiser saber qual o padrão regex que o PHP (actualmente) usa para validar os endereços de E-Mail, veja o código PHP.
Se quiser saber mais sobre endereços de E-mail, sugiro que comece a ler as especificações, mas devo avisá-lo que não é uma leitura fácil de qualquer um. esticar:- rfc5322
- rfc5321
- rfc3696
- rfc6531 (permite caracteres unicode, embora muitos clientes / servidores não o aceitem)
Note que filter_var()
está tal como já indicado apenas disponível a partir de PHP 5.2. No caso de querer que funcione com versões anteriores do PHP, poderá usar a expressão regular utilizada 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 = '[email protected]';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
P. S. A note on the regex pattern used above (from the PHP source). Ele parece que tem alguns direitos de autor de Michael Rushton. Como indicado: "Sinta-se livre para usar e redistribuir este código. Mas por favor, mantenha este Aviso de copyright."
Pode usar filter_var para isto.
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
Na minha experiência, regex
as soluções têm demasiados falsos positivos e filter_var()
as soluções têm falsos negativos (especialmente com todos os mais recentes TLDs ).
Em vez disso, é melhor certificar-se de que o endereço tem todas as partes necessárias de um endereço de E-mail (Usuário, símbolo"@", e domínio), em seguida, verificar se o domínio em si existe.
Não há forma de determinar (lado do servidor) se existe um utilizador de E-mail para um domínio externo.
Este é um método que criei num Classe de utilidade: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;
}
Isto não só validará o seu e-mail, como também o sanitizará para 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);
}
Respondi a isto na "pergunta principal" sobre a verificação dos E-mails https://stackoverflow.com/a/41129750/1848217
Para mim, a forma correcta de verificar e-mails é:
- verifique se o símbolo @ existe, e antes e depois existem alguns símbolos Não -@:
/^[^@]+@[^@]+$/
- tente enviar um e-mail para este endereço com algum "código de activação".
Quando o utilizador "ativou" o seu endereço de E-mail, veremos que está tudo bem.De claro, você pode mostrar algum aviso ou dica no front-end quando o usuário e-mail "estranho" escrito para ajudá - lo a evitar erros comuns, como não dot in domain part or spaces in name without quoting and so on. Mas você deve aceitar o endereço "hello@world" se o usuário realmente quiser.
Além disso, deve lembrar-se que o padrão do endereço de E-mail era e pode evolute, então você não pode apenas digitar algum" padrão-válido " uma vez e para sempre. E você deve lembrar que alguma internet concreta os servidores podem falhar alguns detalhes do padrão comum e, de facto, trabalhar com própria "norma modificada".
Então, basta verificar @, dica de utilizador na interface e enviar e-mails de verificação no endereço indicado.
Se você está apenas à procura de uma réplica real que permite vários pontos, sublinhados e traços, é o seguinte: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Isso permitirá que um email com um aspecto bastante estúpido como tom_anderson.1-neo@my-mail_matrix.com
seja validado.
Se quiser verificar se o domínio fornecido pelo a partir do endereço de E-Mail é válido, use algo do tipo:
/*
* 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 é uma forma útil de filtrar muitos endereços de E-mail inválidos, juntamente com a validação de E-mail standart, porque o formato de E-mail válido não significa válido.
Note que idn_to_ascii()
(ou a sua função irmã idn_to_utf8()
) pode não estar disponível na sua instalação de PHP, requer extensões PECL intl > = 1,0.2 e PECL idn > = 0.1.
Tenha também em mente que o IPv4 ou o IPv6 como parte do domínio no email (por exemplo user@[IPv6:2001:db8::1]
) não pode ser validado, apenas nomeado As máquinas podem.
Veja mais aqui.
/(?![[:alnum:]]|@|-|_|\.)./
[[5]} Hoje em dia, se você usar um formulário HTML5 com {[[2]} então você já está 80% seguro, uma vez que os motores de navegador têm o seu próprio validador. Para complementá-lo, adicione este regex ao seu preg_match_all()
e negá-lo:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }
Procurar a expressão regular usada pelos formulários HTML5 para validação
https://regex101.com/r/mPEKmy/1