Ao longo dos anos, desenvolvi lentamente uma expressão regular que valida a maioria dos endereços de email corretamente, supondo que eles não usem um endereço IP como parte do servidor.
Eu o uso em vários programas PHP e funciona na maioria das vezes. No entanto, ocasionalmente, sou contactado por alguém que está tendo problemas com um site que o usa e acabo tendo que fazer alguns ajustes (mais recentemente, percebi que não estava permitindo TLDs de quatro caracteres).
Qual é a melhor expressão regular que você tem ou viu para validar e-mails?
Eu já vi várias soluções que usam funções que usam várias expressões mais curtas, mas prefiro uma expressão longa e complexa em uma função simples, em vez de várias expressões curtas em uma função mais complexa.
fonte
Respostas:
O regex totalmente compatível com RFC 822 é ineficiente e obscuro devido ao seu comprimento. Felizmente, o RFC 822 foi substituído duas vezes e a especificação atual para endereços de email é RFC 5322 . O RFC 5322 leva a um regex que pode ser entendido se estudado por alguns minutos e é eficiente o suficiente para uso real.
Um regex compatível com RFC 5322 pode ser encontrado na parte superior da página em http://emailregex.com/, mas usa o padrão de endereço IP que está flutuando na Internet com um bug que permite
00
qualquer valor decimal de byte não assinado em um endereço delimitado por pontos, o que é ilegal. O restante parece ser consistente com a gramática RFC 5322 e passa em vários testesgrep -Po
, incluindo nomes de domínio de casos, endereços IP, nomes ruins e nomes de contas com e sem aspas.Corrigindo o
00
bug no padrão IP, obtemos um regex funcional e bastante rápido. (Raspe a versão renderizada, não a remarcação, para obter o código real.)ou:
Aqui está um diagrama da máquina de estados finitos para o regexp acima, que é mais claro que o próprio regexp
Os padrões mais sofisticados em Perl e PCRE (biblioteca de expressões regulares usadas, por exemplo, em PHP) podem analisar corretamente o RFC 5322 sem problemas . Python e C # também podem fazer isso, mas eles usam uma sintaxe diferente das duas primeiras. No entanto, se você for forçado a usar uma das muitas linguagens de correspondência de padrões menos poderosas, é melhor usar um analisador real.
Também é importante entender que a validação pelo RFC não diz absolutamente nada sobre se esse endereço realmente existe no domínio fornecido ou se a pessoa que digita o endereço é seu verdadeiro proprietário. As pessoas assinam outras listas de discussão dessa maneira o tempo todo. Correção que requer um tipo de validação mais sofisticado que envolve o envio desse endereço para uma mensagem que inclui um token de confirmação que deve ser inserido na mesma página da Web que era o endereço.
Os tokens de confirmação são a única maneira de saber que você obteve o endereço da pessoa que o inseriu. É por isso que a maioria das listas de discussão agora usa esse mecanismo para confirmar as inscrições. Afinal, qualquer um pode recusar
[email protected]
, e isso até parecerá legal, mas provavelmente não será a pessoa do outro lado.Para PHP, você não deve usar o padrão fornecido em Validar um endereço de email com PHP, a maneira correta da qual cito:
Isso não é melhor do que todos os outros padrões não RFC. Nem sequer é inteligente o suficiente para lidar com o RFC 822 , muito menos o RFC 5322. Este , no entanto, é.
Se você quiser ser sofisticado e pedante, implemente um mecanismo de estado completo . Uma expressão regular só pode atuar como um filtro rudimentar. O problema com expressões regulares é que dizer a alguém que seu endereço de email perfeitamente válido é inválido (um falso positivo) porque sua expressão regular não pode lidar com isso é apenas rude e indelicado da perspectiva do usuário. Um mecanismo de estado para esse fim pode validar e até corrigir endereços de email que, de outra forma, seriam considerados inválidos, pois desmontam o endereço de email de acordo com cada RFC. Isso permite uma experiência potencialmente mais agradável, como
Consulte também Validando endereços de email , incluindo os comentários. Ou Comparando o endereço de email validando expressões regulares .
Demo de depuração
fonte
Você não deve usar expressões regulares para validar endereços de email.
Em vez disso, use a classe MailAddress , assim:
A
MailAddress
classe usa um analisador BNF para validar o endereço de acordo com a RFC822.Se você planeja usar o
MailAddress
para validar o endereço de email, saiba que essa abordagem também aceita a parte do nome para exibição do endereço de email, e isso pode não ser exatamente o que você deseja obter. Por exemplo, ele aceita essas sequências como endereços de email válidos:Em alguns desses casos, apenas a última parte das cadeias é analisada como o endereço; o restante antes desse é o nome de exibição. Para obter um endereço de email simples sem nenhum nome para exibição, verifique o endereço normalizado com a string original.
Além disso, um endereço com um ponto no final, como também
user@company.
é aceito pelo MailAddress.Se você realmente deseja usar uma regex, aqui está :
fonte
[email protected]
. Você não deve confiar na validação de email para impedir o XSS.Essa pergunta é muito solicitada, mas acho que você deve se afastar e se perguntar por que deseja validar endereços de email sintaticamente. Qual é o benefício realmente?
Se você deseja validar se um email está correto, você não tem escolha a não ser enviar um email de confirmação e solicitar que o usuário responda a isso. Em muitos casos, você terá que enviar um e-mail de confirmação de qualquer maneira por motivos de segurança ou por motivos éticos (portanto, você não pode, por exemplo, contratar alguém para um serviço contra a sua vontade).
fonte
me@hotmail
, obviamente não receberá seu e-mail de confirmação e, então, onde está? Eles não estão mais no seu site e estão se perguntando por que não conseguiram se inscrever. Na verdade não, eles não são - eles se esqueceram completamente de você. No entanto, se você pudesse fazer uma verificação básica de sanidade com uma regex enquanto ela ainda estiver com você, eles poderão detectar esse erro imediatamente e você terá um usuário satisfeito.[email protected]
endereços indicam um comandante-chefe muito nervoso. :)Tudo depende da precisão que você deseja ser. Para os meus propósitos, quando estou apenas tentando impedir coisas como
bob @ aol.com
(espaços em emails) ousteve
(nenhum domínio) oumary@aolcom
(nenhum período antes de .com), eu usoClaro, ele corresponderá a itens que não são endereços de email válidos, mas é uma questão de obter erros simples comuns.
Há várias alterações que podem ser feitas nesse regex (e algumas estão nos comentários desta resposta), mas é simples, fácil de entender e é uma boa primeira tentativa.
fonte
.
está incluído no\S
.mary@aolcom
que eu sou lixo completo. YMMV@
sinais:/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/
jsfiddle.net/b9chris/mXB96 #Depende do que você quer dizer com melhor: Se você está falando em pegar todos os endereços de email válidos, use o seguinte:
( http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html ) Se você estiver procurando por algo mais simples, mas que capte os endereços de e-mail mais válidos, tente algo como:
EDIT: A partir do link:
fonte
email address
que passam erroneamente pelo segundo, mas são capturados pelo regex mais longo?[ATUALIZADO] Reuni tudo o que sei sobre validação de endereço de email aqui: http://isemail.info , que agora não apenas valida, mas também diagnostica problemas com endereços de email. Concordo com muitos dos comentários aqui de que a validação é apenas parte da resposta; veja meu ensaio em http://isemail.info/about .
is_email () continua sendo, até onde eu sei, o único validador que informará definitivamente se uma determinada string é um endereço de email válido ou não. Fiz upload de uma nova versão em http://isemail.info/
Reuni os casos de teste de Cal Henderson, Dave Child, Phil Haack, Doug Lovell, RFC5322 e RFC 3696. 275 endereços de teste ao todo. Eu executei todos esses testes contra todos os validadores gratuitos que pude encontrar.
Vou tentar manter esta página atualizada à medida que as pessoas aprimoram seus validadores. Agradeço a Cal, Michael, Dave, Paul e Phil por sua ajuda e cooperação na compilação desses testes e críticas construtivas de meu próprio validador .
As pessoas devem estar cientes da errata contra a RFC 3696 em particular. Três dos exemplos canônicos são de fato endereços inválidos. E o tamanho máximo de um endereço é 254 ou 256 caracteres, não 320.
fonte
[email protected]
pois esse código é sobre validação, não interpretação. Se você gostaria de adicionar um tradutor punycode então eu estou feliz em aceitar um pedido de puxar a github.com/dominicsayers/isemailDe acordo com a especificação HTML5 do W3C :
Contexto:
fonte
john.doe@localhost
é válido. Com certeza, em uma aplicação no mundo real (ou seja, uma comunidade), eu gostaria de sua sugerem substituir * por +"test...."@gmail.com
é perfeitamente válido de acordo com a RFC e semanticamente equivalente a[email protected]
.É fácil no Perl 5.10 ou mais recente:
fonte
addrspec
parte é realmente relevante para a questão. Aceitar mais do que isso e encaminhá-lo embora alguma outra parte do sistema que não esteja pronta para aceitar endereços RFC5822 completos é como fotografar é o seu próprio pé.eu uso
Qual é o usado no ASP.NET pelo RegularExpressionValidator.
fonte
[email protected]
é rejeitado.^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w{2,}([-.]\\w+)*$
[email protected]
que é de fato válido (um cliente nosso tinha um endereço semelhante) `Não sei o que é melhor, mas este é pelo menos correto, desde que os endereços tenham seus comentários retirados e substituídos por espaços em branco.
A sério. Você deve usar uma biblioteca já escrita para validar e-mails. A melhor maneira é provavelmente apenas enviar um email de verificação para esse endereço.
fonte
Os endereços de email que eu quero validar serão usados por um aplicativo Web ASP.NET usando o espaço para nome System.Net.Mail para enviar emails a uma lista de pessoas. Portanto, em vez de usar uma expressão regular muito complexa, apenas tento criar uma instância de MailAddress a partir do endereço. O construtor MailAddress lançará uma exceção se o endereço não for formado corretamente. Dessa forma, eu sei que posso pelo menos obter o e-mail imediatamente. Obviamente, essa é a validação do servidor, mas, no mínimo, você precisa disso.
fonte
args.Value
vez de fazer referência ao campo comotxtEmail.Text
codificado. O último vinculará seu validador à instância de controle único, que pode estar OK, desde que você tenha um único campo de email, mas não seja recomendado de outra forma.Resposta rápida
Use o seguinte regex para validação de entrada:
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+
Endereços correspondidos por este regex:
A segunda restrição é uma restrição no RFC 5321/5322.
Resposta elaborada
Usar uma expressão regular que reconheça endereços de email pode ser útil em várias situações: por exemplo, procurar endereços de email em um documento, validar a entrada do usuário ou como uma restrição de integridade em um repositório de dados.
No entanto, deve-se observar que, se você quiser descobrir se o endereço realmente se refere a uma caixa de correio existente, não há substituto para o envio de uma mensagem para o endereço. Se você quiser apenas verificar se um endereço está gramaticalmente correto, poderá usar uma expressão regular, mas observe que
""@[]
é um endereço de email gramaticalmente correto que certamente não se refere a uma caixa de correio existente.A sintaxe dos endereços de email foi definida em várias RFCs , principalmente na RFC 822 e na RFC 5322 . A RFC 822 deve ser vista como o padrão "original" e a RFC 5322 como o padrão mais recente. A sintaxe definida na RFC 822 é a mais branda e os padrões subsequentes restringiram a sintaxe cada vez mais, onde sistemas ou serviços mais recentes devem reconhecer a sintaxe obsoleta, mas nunca a produzem.
Nesta resposta, entenderei "endereço de email"
addr-spec
como definido nas RFCs (isto é[email protected]
, mas não"John Doe"<[email protected]>
, nemsome-group:[email protected],[email protected];
).Há um problema em converter as sintaxes RFC em regexes: as sintaxes não são regulares! Isso ocorre porque eles permitem comentários opcionais em endereços de email que podem ser infinitamente aninhados, enquanto o aninhamento infinito não pode ser descrito por uma expressão regular. Para procurar ou validar endereços contendo comentários, você precisa de um analisador ou de expressões mais poderosas. (Observe que linguagens como Perl têm construções para descrever gramáticas livres de contexto de maneira semelhante a expressões regulares.) Nesta resposta, desconsiderarei os comentários e considerarei apenas expressões regulares apropriadas.
Os RFCs definem sintaxes para mensagens de email, não para endereços de email como tais. Os endereços podem aparecer em vários campos de cabeçalho e é aqui que eles são definidos principalmente. Quando eles aparecem nos campos do cabeçalho, os endereços podem conter (entre tokens lexicais) espaços em branco, comentários e até quebras de linha. Semanticamente, isso não tem significado, no entanto. Ao remover esse espaço em branco etc. de um endereço, você obtém uma representação canônica semanticamente equivalente . Assim, a representação canônica de
first. last (comment) @ [3.5.7.9]
éfirst.last@[3.5.7.9]
.Diferentes sintaxes devem ser usadas para diferentes propósitos. Se você deseja procurar endereços de e-mail em um documento (possivelmente muito antigo), pode ser uma boa idéia usar a sintaxe conforme definida na RFC 822. Por outro lado, se você deseja validar a entrada do usuário, pode usar o sintaxe conforme definido na RFC 5322, provavelmente aceitando apenas representações canônicas. Você deve decidir qual sintaxe se aplica ao seu caso específico.
Eu uso expressões regulares "estendidas" POSIX nesta resposta, assumindo um conjunto de caracteres compatíveis com ASCII.
RFC 822
Cheguei à seguinte expressão regular. Convido todos a tentarem quebrá-lo. Se você encontrar algum falso positivo ou falso, poste-o em um comentário e tentarei corrigir a expressão o mais rápido possível.
([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*
Eu acredito que é totalmente compatível com a RFC 822, incluindo as erratas . Ele reconhece apenas endereços de email em sua forma canônica. Para um regex que reconhece espaços em branco (dobráveis), veja a derivação abaixo.
A derivação mostra como cheguei à expressão. Listo todas as regras gramaticais relevantes da RFC exatamente como elas aparecem, seguidas pela regex correspondente. Onde uma errata foi publicada, dou uma expressão separada para a regra gramatical corrigida (marcada como "errata") e uso a versão atualizada como uma subexpressão nas expressões regulares subsequentes.
Como indicado no parágrafo 3.1.4. do RFC 822, o espaço em branco linear opcional pode ser inserido entre tokens lexicais. Onde aplicável, expandi as expressões para acomodar essa regra e marquei o resultado com "opt-lwsp".
RFC 5322
Cheguei à seguinte expressão regular. Convido todos a tentarem quebrá-lo. Se você encontrar algum falso positivo ou falso, poste-o em um comentário e tentarei corrigir a expressão o mais rápido possível.
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])
Eu acredito que é totalmente compatível com a RFC 5322, incluindo as erratas . Ele reconhece apenas endereços de email em sua forma canônica. Para um regex que reconhece espaços em branco (dobráveis), veja a derivação abaixo.
A derivação mostra como cheguei à expressão. Listo todas as regras gramaticais relevantes da RFC exatamente como elas aparecem, seguidas pela regex correspondente. Para regras que incluem espaços em branco semanticamente irrelevantes (dobráveis), dou um regex separado marcado com "(normalizado)" que não aceita esse espaço em branco.
Eu ignorei todas as regras "obs-" da RFC. Isso significa que as expressões regulares correspondem apenas a endereços de email estritamente compatíveis com o RFC 5322. Se você precisar corresponder endereços "antigos" (como a gramática mais flexível, incluindo as regras "obs-"), poderá usar uma das expressões regulares do RFC 822 do parágrafo anterior.
Observe que algumas fontes (principalmente o w3c ) afirmam que o RFC 5322 é muito rigoroso na parte local (ou seja, a parte antes do sinal @). Isso ocorre porque "..", "a..b" e "a". não são átomos de ponto válidos, embora possam ser usados como nomes de caixas de correio. O RFC, no entanto, não permitem partes locais como estes, exceto que eles têm de ser citado. Então, em vez de
[email protected]
você deve escrever"a..b"@example.net
, que é semanticamente equivalente.Restrições adicionais
O SMTP (conforme definido na RFC 5321 ) restringe ainda mais o conjunto de endereços de email válidos (ou na verdade: nomes de caixas de correio). Parece razoável impor essa gramática mais rígida, para que o endereço de email correspondente possa realmente ser usado para enviar um email.
O RFC 5321 basicamente deixa em branco a parte "local" (ou seja, a parte antes do sinal @), mas é mais rígida na parte do domínio (ou seja, a parte após o sinal @). Ele permite apenas nomes de host no lugar de átomos de ponto e literais de endereço no lugar de literais de domínio.
A gramática apresentada na RFC 5321 é muito branda quando se trata de nomes de host e endereços IP. Tomei a liberdade de "corrigir" as regras em questão, usando este rascunho e a RFC 1034 como diretrizes. Aqui está o regex resultante.
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((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}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{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})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])
Observe que, dependendo do caso de uso, talvez você não queira permitir um "literal de endereço geral" em seu regex. Observe também que usei um lookahead negativo
(?!IPv6:)
no regex final para impedir que a parte "General-address-literal" corresponda a endereços IPv6 malformados. Alguns processadores regex não suportam aparência negativa. Remova a substring|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+
da regex se desejar remover toda a parte "General-address-literal".Aqui está a derivação:
Validação de entrada do usuário
Um caso de uso comum é a validação de entrada do usuário, por exemplo, em um formulário html. Nesse caso, geralmente é razoável impedir literais de endereço e exigir pelo menos dois rótulos no nome do host. Tomando como base a regex RFC 5321 aprimorada da seção anterior, a expressão resultante seria:
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+
Não recomendo restringir ainda mais a parte local, por exemplo, impedindo as strings entre aspas, pois não sabemos que tipo de nome de caixa de correio alguns hosts permitem (como
"a..b"@example.net
ou até mesmo"a b"@example.net
).Também não recomendo a validação explícita em uma lista de domínios literais de nível superior ou mesmo a imposição de restrições de comprimento (lembre-se de como ".museum" é invalidado
[a-z]{2,4}
), mas se você precisar:([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?\.)*(net|org|com|info|
etc ...)
Mantenha seu regex atualizado se você decidir seguir o caminho da validação explícita do domínio de nível superior.
Considerações adicionais
Ao aceitar apenas nomes de host na parte do domínio (após o sinal @), as expressões regulares acima aceitam apenas rótulos com no máximo 63 caracteres, como deveriam. No entanto, eles não impõem o fato de que o nome do host inteiro deve ter no máximo 253 caracteres (incluindo os pontos). Embora essa restrição ainda seja estritamente regular, não é viável criar um regex que incorpore essa regra.
Outra consideração, especialmente ao usar as expressões regulares para validação de entrada, é o feedback para o usuário. Se um usuário digitar um endereço incorreto, seria bom fornecer um pouco mais de feedback do que um simples "endereço sintaticamente incorreto". Com expressões regulares "vanilla", isso não é possível.
Essas duas considerações podem ser abordadas analisando o endereço. A restrição de tamanho extra nos nomes de host também pode, em alguns casos, ser resolvida usando uma regex extra que a verifica e combinando o endereço com as duas expressões.
Nenhuma das expressões regulares nesta resposta é otimizada para desempenho. Se o desempenho é um problema, você deve ver se (e como) a regex de sua escolha pode ser otimizada.
fonte
arbitrary-long-email-address-should-be-invalid-arbitrary-long-email-address-should-be-invalid.and-the-second-group-also-should-not-be-so-long-and-the-second-group-also-should-not-be-so-long@example.com
, não deve validar. Sugiro alterar os sinais "+" no primeiro grupo (nome antes do ponto opcional) e no segundo grupo (nome após os seguintes pontos) para{1,64}
$emailRegex = '/^([-!#-\'*+\/-9=?A-Z^-~]{1,64}(\.[-!#-\'*+\/-9=?A-Z^-~]{1,64})*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+$/';
Existem muitos exemplos disso na rede (e acho que mesmo um que valida completamente a RFC - mas tem dezenas / centenas de linhas se a memória servir). As pessoas tendem a se empolgar validando esse tipo de coisa. Por que não apenas verificar se tem um @ e pelo menos um. e atende a um comprimento mínimo simples. É trivial inserir um e-mail falso e ainda assim corresponder a qualquer regex válido. Eu diria que os falsos positivos são melhores que os falsos negativos.
fonte
Ao decidir quais caracteres são permitidos, lembre-se de seus amigos apóstrofos e hifenizados. Não tenho controle sobre o fato de minha empresa gerar meu endereço de e-mail usando meu nome no sistema de RH. Isso inclui o apóstrofo no meu sobrenome. Não sei dizer quantas vezes fui impedido de interagir com um site pelo fato de meu endereço de email ser "inválido".
fonte
Este regex é da biblioteca Email :: Valid do Perl . Acredito que seja o mais preciso, corresponde a todos os 822. E é baseado na expressão regular do livro de O'Reilly:
fonte
Enquanto você escreve em PHP, aconselho você a usar a validação embutida do PHP para emails.
Se você estiver executando uma versão php menor que 5.3.6, esteja ciente deste problema: https://bugs.php.net/bug.php?id=53091
Se você quiser obter mais informações sobre como essa validação de buid-in funciona, consulte aqui: O PHP filter_var FILTER_VALIDATE_EMAIL realmente funciona?
fonte
Cal Henderson (Flickr) escreveu um artigo chamado Analisando endereços de email em PHP e mostra como fazer uma análise adequada de endereços de email compatíveis com RFC (2) 822. Você também pode obter o código fonte em php , python e ruby, que é licenciado cc .
fonte
a@b
era válidoa@b
é válido ... neste caso,b
é o domínio de nível superior.Eu nunca me incomodo em criar com minha própria expressão regular, porque é provável que alguém já tenha apresentado uma versão melhor. Eu sempre uso o regexlib para encontrar um ao meu gosto.
fonte
Não existe um que seja realmente utilizável.
Discuto alguns problemas na minha resposta para Existe uma biblioteca php para validação de endereço de email? , é discutido também no reconhecimento Regexp do endereço de e-mail difícil?
Em resumo, não espere que uma única regex utilizável faça um trabalho adequado. E o melhor regex validará a sintaxe, não a validade de um email ([email protected] está correto, mas provavelmente será devolvido ...).
fonte
Uma expressão regular simples que ao menos não rejeitaria qualquer endereço de email válido seria procurar algo, seguido por um sinal @ e depois algo seguido por um período e pelo menos duas coisas. Ele não rejeita nada, mas depois de revisar as especificações, não consigo encontrar nenhum e-mail válido e rejeitado.
email = ~
/.+@[^@]+\.[^@]{2,}$/
fonte
/^[^@]+@[^@]+\.[^@]{2}[^@]*$/
na verdade, verifica se há 1 sinal. Sua regex permitirá a passagem múltipla por causa do. * No final./^[^@]+@[^@]+\.[^@]{2,4}$/
certifique-se de que termine com 2 a 4 caracteres não @. Como o @Josh apontou, agora permite um @ extra no final. Mas você também pode alterar isso para:/^[^@]+@[^@]+\.[^a-z-A-Z]{2,4}$/
como todos os domínios de nível superior são caracteres aZ. você pode substituir4
por5
ou mais, permitindo que os nomes de domínio de nível superior também sejam mais longos no futuro.Você pode usar o empregado pelo plugin jQuery Validation:
fonte
a-b'[email protected]
mas foi capaz de pegar as variações inadequadas, tais comoa-b'[email protected]
ea-b'[email protected]
Para uma avaliação mais abrangente da melhor expressão regular para validar um endereço de email, consulte este link; " Comparando endereço de email validando expressões regulares "
Aqui está a expressão principal atual para fins de referência:
fonte
Sem mencionar que nomes de domínio não latinos (chinês, árabe, grego, hebraico, cirílico e assim por diante) serão permitidos em um futuro próximo . Todo mundo tem que mudar o regex de email usado, porque esses caracteres certamente não devem ser cobertos por
[a-z]/i
nem\w
. Todos eles falharão.Afinal, a melhor maneira de validar o endereço de email ainda é enviar um email para o endereço em questão para validar o endereço. Se o endereço de email fizer parte da autenticação do usuário (registro / login / etc), você poderá combiná-lo perfeitamente com o sistema de ativação do usuário. Ou seja, envie um email com um link com uma chave de ativação exclusiva para o endereço de email especificado e só permita o login quando o usuário tiver ativado a conta recém-criada usando o link no email.
Se o objetivo da regex é apenas informar rapidamente o usuário na interface do usuário de que o endereço de email especificado não se parece com o formato correto, o melhor ainda é verificar se ele corresponde basicamente à seguinte regex:
Simples assim. Por que diabos você se importaria com os caracteres usados no nome e no domínio? É de responsabilidade do cliente digitar um endereço de email válido, não o do servidor. Mesmo quando o cliente digita um endereço de email sintaticamente válido como
[email protected]
, isso não garante que seja um endereço de email legítimo. Ninguém regex pode cobrir isso.fonte
spaces
após o@.
eg.[email protected] com net
é considerado um email válido usando o regex acima, onde deve retornar inválido.A especificação HTML5 sugere uma regex simples para validar endereços de email:
Isso intencionalmente não está em conformidade com a RFC 5322 .
O comprimento total também pode ser limitado a 254 caracteres, de acordo com a RFC 3696 errata 1690 .
fonte
invalid@emailaddress
. Eu recomendaria cautela e muitos testes antes de usá-lo!Para uma demonstração vívida, o monstro a seguir é muito bom, mas ainda não reconhece corretamente todos os endereços de email sintaticamente válidos: reconhece comentários aninhados com até quatro níveis de profundidade.
Esse é um trabalho para um analisador, mas, mesmo que um endereço seja sintaticamente válido, ele ainda pode não ser entregue. Às vezes você tem que recorrer ao método caipira de "Ei, pessoal, observe-nos!"
fonte
De acordo com o padrão oficial RFC 2822, o regex de e-mail válido é
se você quiser usá-lo em Java é realmente muito fácil
fonte
(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Aqui está o PHP que eu uso. Eu escolhi esta solução com o espírito de "falsos positivos são melhores que falsos negativos", como declarado por outro comentarista aqui E com relação a manter o tempo de resposta e a carga do servidor baixos ... realmente não há necessidade de desperdiçar recursos do servidor com uma expressão regular quando isso eliminará o erro mais simples do usuário. Você sempre pode acompanhar isso enviando um email de teste, se desejar.
fonte
Padrão RFC 5322:
Permite parte local do átomo de ponto, parte local da cadeia de caracteres citada, parte local obsoleta (átomo de ponto misto e cadeia de caracteres citada), domínio do nome de domínio, domínio literal de domínio (endereço IPv4, IPv6 e endereço IPv6 mapeado para IPv4), domínio literal, e CFWS (aninhado).
Padrão RFC 5321:
Permite parte local de átomo de ponto, parte local de cadeia de caracteres entre aspas, domínio de nome de domínio e domínio literal de domínio (endereço IPv4, IPv6 e IPv6 mapeado para IPv4).
Básico:
Permite a parte local do átomo de ponto e o domínio de nome de domínio (exigindo pelo menos dois rótulos de nome de domínio com o TLD limitado a 2-6 caracteres alfabéticos).
fonte
/D
bandeira e você a citou com aspas simples, mas também usou barras para delimitar o padrão? Não é Perl, e não pode ser PCRE. Portanto, é PHP? Eu acredito que esses são os únicos três que permitem recursão(?1)
.Estranho que você "não possa" permitir TLDs de 4 caracteres. Você está banindo pessoas de .info e .name , e a limitação de comprimento para .travel e .museum , mas sim, são menos comuns que TLDs de 2 caracteres e TLDs de 3 caracteres.
Você deve permitir alfabetos maiúsculos também. Os sistemas de email normalizarão a parte local e a parte do domínio.
Para sua regex da parte do domínio, o nome do domínio não pode começar com '-' e não pode terminar com '-'. Dash só pode ficar no meio.
Se você usou a biblioteca PEAR, verifique a função de email (esqueceu o nome / biblioteca exatos). Você pode validar o endereço de email chamando uma função e ela valida o endereço de email de acordo com a definição no RFC822.
fonte
fonte