RegExp + Mail validator

OldMan

Power Member
Boas!
Estou a tentar fazer a validação de uma string que vem de uma textbox.
Descobri agora as RegExp e ainda não consigo ver lógica nenhuma naquilo... mas parece-me que esta será a maneira mais fácil de fazer a validação da string (client side).

O que precisava era de saber ao certo quais os caracteres que são permitidos nos mails para que a RegExp que usar seja coerente com isso.

Já vi exemplos em Javascript que nem sequer deixam passar mails tipo [email protected] pelo facto de ter 2 "." depois do "@" e há mails assim.
O que me interessava seria definir os caracteres possíveis de serem usados e depois verifico se a string tem mais algum que não era suposto lá estar.

(se alguém quiser deixar um link para uma BOA explicação sobre como funcionam as regexp agradecia)


Obrigado
 
o dominio de caracteres possiveis defines com parentesis rectos, algo do tipo [a-z0-9] em que dizes que só aceitas caracteres numéricos e alfanuméricos podes extender este conceito para outro tipo de caracteres do tipo [a-z0-9+_-]
Neste site http://www.regular-expressions.info/ podes ver alguns exemplos sobre validação de emails e com a reference para regexps.
Como normalmente uso expressões regulares em java o site que consulto é o http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html e começo a brincar a partir daí. Normalmente no google consigo arranjar exemplos que poderão servir e esse do email em javascript deves ter montes de exemplos.
 
Não acho que devas ir por aí, através do que não pode lá estar...
Uma das minhas versões para verificar mails é:
Código:
"/^[\_\-a-z0-9]*@[\_\-a-z0-9]*.(.*)$/"
Não é a minha final, mas não está a funcionar muito mal, só que está a aceitar mais do que devia.
 
Em php costumo fazer assim, utilizando a seguinte expressão regular:

if (!ereg("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$", $_POST['email']))
{
echo = "E-mail Inválido";
}


Boa Sorte:P
Abraços...
 
@Lostctrl, de facto o que não falta são exemplos de validação de mails, mas a minha dúvida mantem-se *.
[a-z0-9+_-] Aqui são aceites letras de "a" a "z", número de "0" a "9" e o caracteres "_" e "-"? O "+" faz parte da syntax ou também é aceite?

@anjo2, o objectivo era definir os caracteres possíveis e depois verificar se o mail tem algum "intruso".

@cryteck, eu olho para essa regexp e não vejo nada :rolleyes: Nem me posso considerar verde neste conceito, estou mesmo azul!
Mas PHP não tem uma função já dedicada a regexp? Tinha ideia que sim.




Não vou usar só a regexp para validar o mail, aliás até já tinha feito alguns "if" para validar essa string, como não poder ter 2 "@", não poder ter um "." imediatamente antes ou depois do "@", etc... Por isso a regexp era mesmo SÓ para me dizer se há caracteres que não deviam lá estar ($ % & / ? ...).

* A questão é: onde é que posso saber que caracteres são possíveis nos mails? Já li em algum sitio um gajo a dizer que mails com "+" podem existir e pelo facto de nunca ter visto nenhum fico sem saber se heide permitir isso ou não.

Obrigado a todos.
 
A-Z, a-z, -, _, 0-9, tem de começar com letra ou numero e depois do arroba igual.
O filtro de mail do php dá também para redes internas o que valida também domínios impossíveis de existir na internet.
 
Picture+1.png


@anjo2, estive a ler algumas coisas do link que o Lostctrl deixou e cheguei até isso que se vê na imagem, que é o que dizias no último post. (só tenho lá o "+" a mais :D)

Isso de começar por letra/número confiro com javascript que é mais fácil para mim.


Btw, esse filtro que falavas do php faz o que em concreto, sabes? Que tipo de domínios não podem existir?
Tinha ideia que era como os mails. Para além de não se poder usar o "_" o resto seria igual.
 
Última edição:
@anjo2, estive a ler algumas coisas do link que o Lostctrl deixou e cheguei até isso que se vê na imagem, que é o que dizias no último post. (só tenho lá o "+" a mais :D)

Isso de começar por letra/número confiro com javascript que é mais fácil para mim.


Btw, esse filtro que falavas do php faz o que em concreto, sabes? Que tipo de domínios não podem existir?
Tinha ideia que era como os mails. Para além de não se poder usar o "_" o resto seria igual.



OldMan, a expressão regular que o cryteck deixou é a que tu precisas, valida a estrutura, mas não valida o conteúdo (dominios válidos, etc...) isso é outra guerra.

Basta acrescentares os caracteres que precisas aqui : ^[0-9a-z]([-_.AQUI]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$
ou aqui ^[0-9a-zAQUI]([-_.]?[0-9a-z])*@[0-9a-zE AQUI IGUAL]([-.]?[0-9a-z])*\\.[a-z]{2,4}$

No primeiro caso garantes que não termina com os caracteres definidos antes da arroba do tipo [email protected] ou [email protected] no segundo aceita qualquer caracter antes da arroba e no inicio do email do tipo [email protected]
Espero que me tenha feito explicar.

Abraço
 
Última edição:
E cá está uma breve explicação da estrutura de um email address:

The local-part of the e-mail address may use any of these ASCII characters:
Uppercase and lowercase English letters (a-z, A-Z)
Digits 0 through 9
Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
Character . provided that it is not the first nor last character, nor may it appear two or more times consecutively
by http://en.wikipedia.org/wiki/E-mail_address

e respectivo RFC em http://tools.ietf.org/html/rfc5322#section-3.4.1

Cumprs
 
Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
Então pelo que citaste quer dizer que este caracteres são todos permitidos? :o
 
Ao que parece a expressão não funciona da mesma forma no programa Reggy e no Javascript.

No reggy:
[email protected] - fail
[email protected] - win
[email protected] - win
[email protected] - win
[email protected] - fail
joao@joao - fail

No javascript:
[email protected] - fail
[email protected] - win
[email protected] - win
[email protected] - win
[email protected] - win
joao@joao - win


Está aqui a página em que estou a testar com javascript:
http://dl.getdropbox.com/u/336918/test.html





*EDIT
antes tinha:
Código:
if (finalMail.match([U][B]"[/B][/U]^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$[U][B]"[/B][/U])) {

mudei para:
Código:
if (finalMail.match([U][B]/[/B][/U]^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$[U][B]/[/B][/U])) {
 
Última edição:
Eu substitui por esta linha:

if (finalMail.match("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$")) {

e funcionou direito.
 
Back
Topo