Eu tenho esta função para validar um endereço de email:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
Não há problema em verificar se o endereço de email é válido ou não?
php
regex
email
email-validation
Cameron
fonte
fonte
validateEmail
seria correto, além de passageiro$email
, não$EMAIL
.Respostas:
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:Além disso, você pode verificar se o domínio define um
MX
registro: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: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".
fonte
filter_var
ficarão para trás por algum tempo, mesmo que eles sejam alterados agora (eu publiquei um relatório de bug).Você pode usar filter_var para isso.
fonte
Na minha experiência, as
regex
soluções têm muitos falsos positivos e asfilter_var()
soluções têm falsos negativos (especialmente com todos os TLDs mais recentes ).Em vez disso, é melhor garantir que o endereço tenha todas as partes necessárias de um endereço de email (usuário, símbolo "@" e domínio) e verifique se o domínio existe.
Não há como determinar (lado do servidor) se existe um usuário de email para um domínio externo.
Este é um método que eu criei em uma classe Utility:
fonte
stristr
falhará ao obter o domínio se houver vários sinais @. Melhorexplode('@',$email)
e verificar issosizeof($array)==2
checkdnsrr()
retornaria false se houvesse um sinal @ no domínio.Eu acho que você pode estar melhor usando os filtros embutidos do PHP - neste caso em particular:
Pode retornar um valor verdadeiro ou falso quando fornecido com o
FILTER_VALIDATE_EMAIL
parâmetrofonte
Isso não apenas validará seu email, mas também o limpará para caracteres inesperados:
fonte
Respondeu a isso na 'principal pergunta' sobre verificação de e-mails https://stackoverflow.com/a/41129750/1848217
Portanto, marque @, insira o usuário no frontend e envie e-mails de verificação no endereço fornecido.
fonte
@
, mas não verifica se é válido para qualquer um dos RFCs que governam o email. Também não funciona como está escrito. Eu corri através regex101.com e não conseguiu igualar endereços válidos/^[^@]+@[^@+]$/
/^[^@]+@[^@]+$/
filter_var
método? Também não resolve o problema de aceitar endereços mal formatados. Seu regex vai aceitar alegrementejoe@domain
como um endereço de email válido, quando não éfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Mas você tem uma função antiga no servidor, você não pode atualizar em alguns casos. E você perderá clientes com alguns novos e-mails válidos. Além disso, mais uma vez, percebo que nem todos os servidores de envio de email funcionam estritamente de acordo com o padrão comum e moderno de endereços de email.Se você deseja verificar se o domínio fornecido a partir do endereço de email é válido, use algo como:
Essa é uma maneira útil de filtrar muitos endereços de email inválidos, juntamente com a validação de email padrão, porque o formato de email válido não significa email válido .
Note que a função
idn_to_ascii()
(ou a função irmã deleidn_to_utf8()
) pode não estar disponível na instalação do PHP, requer extensões PECL intl> = 1.0.2 e PECL idn> = 0.1.Lembre-se também de que o IPv4 ou IPv6 como parte do domínio no email (por exemplo
user@[IPv6:2001:db8::1]
) não pode ser validado, apenas hosts nomeados podem.Veja mais aqui .
fonte
Depois de ler as respostas aqui, foi com isso que acabei:
fonte
Se você está apenas procurando um regex real que permite a vários pontos, sublinhados e traços, é a seguinte:
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Isso permitirá que um e-mail com aparência bastante estúpidatom_anderson.1-neo@my-mail_matrix.com
seja validado.fonte
Atualmente, se você usa um formulário HTML5
type=email
, já está 80% seguro, pois os mecanismos do navegador têm seu próprio validador. Para complementá-lo, adicione este regex ao seupreg_match_all()
e negue-o:Encontre a regex usada pelos formulários HTML5 para validação
https://regex101.com/r/mPEKmy/1
fonte