Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou estudando ExpReg em PHP.
As ExpReg a seguir não funcionam e eu não percebi o porquê.
Para casar com email tipo: xxxxxxxx@xxxxxxxx.com.br criei a seguinte:
if (!preg_match("/[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9-]+(\.[com]{1}\.[br]{1}){1}/", $_POST['email'])){
$msgemail='Email inválido';
}
Para casar com email tipo: xxxxxxxx@dominio.edu.br criei a seguinte:
if (!preg_match("/[a-z0-9_-]+(\.[a-z0-9_-]+)*@[dominio]{1}(\.[edu]{1}\.[br]{1}){1}/", $_POST['email'])){
$msgemail='Email inválido';
}
Alguma dica?Maujor, no caso específico de validação de email, o PHP já oferece o filtro pronto:
<?php
$input = $_POST['email'];
if (!filter_var($input, FILTER_VALIDADE_EMAIL)) {
$msgemail = 'Email inválido';
}
:seta: [http://php.net/manual/en/function.filter-var.php](http://php.net/manual/en/function.filter-var.php)
Agora, como a pergunta foi referente ao estudo de expressões regulares, então vamos lá:
[dominio], [edu] e [br]
Os colchetes são utilizados para "range", com negação ou não. Se o objetivo é "pegar" os literais "dominio", "edu" e "br", eles devem ser colocados sem os colchetes. Porém, como houve quantificação, então "dominio", "edu" e "br" devem estar entre parênteses, que significa grupo:
/[a-z0-9_-]+(\.[a-z0-9_-]+)*@(dominio){1}(\.(edu){1}\.(br){1}){1}/
Agora, focando nos dois casos dados:
xxxxxxxx@xxxxxxxx.com.br
xxxxxxx@dominio.edu.br
Em ambos, podemos utilizar o primeiro bloco da sua expressão:
/[a-z0-9_-]+(\.[a-z0-9_-]+)@[a-z0-9_-]+(\.[a-z0-9_-]+)\.(com|edu)\.br/
Apenas para simplificar, vou chamar "[a-z0-9_-]" de "intervalo X".
Essa expressão pega:
1. caracteres no intervalo X com no mínimo 1 ocorrência
2. ponto literal seguido pelo intervalo X, podendo ocorrer 0 ou mais vezes.
3. ocorrência obrigatória do @
4. caracteres no intervalo X com no mínimo 1 ocorrência
5. ponto literal seguido pelo intervalo X, podendo ocorrer 0 ou mais vezes.
6. ponto literal
7. A ocorrência do literal "com" OU do literal "edu".
8. ponto literal
9. A ocorrência do literal "br"
<?php
$pattern = '/[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.(com|edu)\.br/';
$subject = array(
'test@example.com.br',
'test.test@testing.edu.br',
'@invalid.com.br',
'alsoinvalid@'
);
foreach ($subject as $email) {
printf("O email '%s' é %s\n", $email, preg_match($pattern, $email) ? 'válido': 'inválido');
}
A saída será:
O email 'test@example.com.br' é válido
O email 'test.test@testing.edu.br' é válido
O email '@invalid.com.br' é inválido
O email 'alsoinvalid@' é inválido
EDIT:
#dica: A utilização das chaves, que também são utilizadas para quantificação, deve ocorrer quando for especificar duas ou mais ocorrências, ou um limite de ocorrências, por exemplo, no mínimo X e no máximo Y.
[inline]*[/inline] - Significa 0 ou mais
[inline]+[/inline] - Significa 1 ou mais
[inline]?[/inline] - Significa 1 ou nenhum
[inline]{X}[/inline] - Significa exatamente X
[inline]{X,Y}[/inline] - Significa no mínimo X e no máximo Y
[inline]/^a*$/[/inline] Vai pegar desde uma string vazia, até uma sequência teoricamente infinita de "a"s.
[inline]/^a+$/[/inline] Vai pegar desde um "a" sozinho, até uma sequência teoricamente infinita de "a"s.
[inline]/^a?$/[/inline] Vai pegar uma string vazia e um "a" sozinho, mas não permite mais do que 1 "a".
[inline]/^a{3}$/[/inline] Vai pegar exatamente 3 "a"s. Se houver 1, 2, 4 ou qualquer coisa diferente de 3 "a"s, então será inválido.
[inline]/^a{2,4}$/[/inline] Vai pegar qualquer string que tenha 2, 3 ou 4 (inclusive) "a"s, se tiver só 1, ou mais do que 4, então será inválido.
;)
@João Batista Neto,
Maravilha. Verdadeira aula muito bem explicada.
Mas, está ocorrendo um problema com seu código que não consigo entender.
<?php
$pattern = '/[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.(com|edu)\.br/';
$subject = array(
'test@example.com.brrt5yuuiii+==--_', <== válido ????
'test.test@testing.edu.brffffffffggggggggg', <== válido ????
);
foreach ($subject as $email) {
printf("O email '%s' é %s\n", $email, preg_match($pattern, $email) ? 'válido': 'inválido');
}
Esta validando a string final br com qualquer acréscimo de caracteres.
As demais partes do email estão OK.Poe br dentro de parentesses (br)
>
Esta validando a string final br com qualquer acréscimo de caracteres.
As demais partes do email estão OK.
Okay, existe um outro detalhe.
Além dos quantificadores, ainda existem os delimitadores. No caso específico do email, podemos utilizar o ^ e o $, que significam, respectivamente, início da linha e fim da linha, por exemplo:
[inline]/a{3}/[/inline] Vai validar qualquer string que tenha 3 "a"s em qualquer lugar.
[inline]/^a{3}/[/inline] Isso significa qualquer string que comece com exatamente 3 "a"s, mas que pode ter qualquer coisa depois.
[inline]/a{3}$/[/inline] Isso significa qualquer string que termine com exatamente 3 "a"s, mas que pode começar com qualquer coisa.
[inline]/^a{3}$/[/inline] Isso significa que a string deve ser, exatamente, "aaa". Qualquer coisa diferente disso, será inválido.
Dessa forma, como estamos lidando com email:
<?php
$pattern = '/^[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.(com|edu)\.br$/';
$subject = array(
'test@example.com.brrt5yuuiii+==--_',
'test.test@testing.edu.brffffffffggggggggg',
);
foreach ($subject as $email) {
printf("O email '%s' é %s\n", $email, preg_match($pattern, $email) ? 'válido': 'inválido');
}
Com isso, a saída será:O email 'test@example.com.brrt5yuuiii+==--_' é inválido
O email 'test.test@testing.edu.brffffffffggggggggg' é inválido
;)
EDIT:
Em alguns casos, poderá ser necessário delimitar a ocorrência de uma expressão, sem que isso ocorra no início ou no fim da expressão. Por exemplo, vamos supor que eu precise validar uma expressão que contenha um email:
"Meu email é fulano@exemplo.com.br e eu gosto de PHP"
Preciso verificar se essa expressão tem um email segundo aquelas regras. Nesse caso, o ^ ou o $ não resolverá o problema, pois o email está no meio da frase. Para isso, podemos utilizar o delimitador [inline]\b[/inline]:
<?php
$pattern = '/\b[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.(com|edu)\.br\b/';
$subject = array(
'O email test@example.com.brrt5yuuiii+==--_ é inválido, então a frase também é ',
'O email test.test@testing.edu.brffffffffggggggggg é inválido, então a frase também é ',
'O email fulano@exemplo.com.br é válido, por isso essa frase também é '
);
foreach ($subject as $email) {
echo $email, preg_match($pattern, $email) ? 'válido': 'inválido', PHP_EOL;
}
A saída será:
O email test@example.com.brrt5yuuiii+==--_ é inválido, então a frase também é inválido
O email test.test@testing.edu.brffffffffggggggggg é inválido, então a frase também é inválido
O email fulano@exemplo.com.br é válido, por isso essa frase também é válido
:D
@João Batista Neto,
:thumbsup: Tudo esclarecido. Obrigado pela aula.
;)
Um complemento à resposta do João sobre as chaves é que você pode omitir o segundo componente, ali representados como Y, fazendo com que o metacaractere case X ou mais ocorrências. Ex:
[inline]{3,}[/inline] representa 3 ou mais.
Assim como é possível simular outros metacaracteres utilizando as chaves:
[inline]{0,1}[/inline], zero ou 1, igual ao opcional (interrogação)
[inline]{0,}[/inline], zero ou mais, igual ao asterisco
[inline]{1,}[/inline], um ou mais, igual ao mais.
E, por fim mas não menos importante, fica como referência o Guia de Expressões Regulares do Aurélio
Só para complementar quem ainda não tem conhecimento sobre Expressão Regular .. Este Excelente Guia explica de forma fácil e descomplicada sobre Expressão Regular :)
>
Só para complementar quem ainda não tem conhecimento sobre Expressão Regular .. Este Excelente Guia explica de forma fácil e descomplicada sobre Expressão Regular :)
http://turing.com.br/material/regex/introducao.html
Não mais do que o Aurélio #sorrylaser
Não mais do que o Aurélio #sorrylaser
Is Free .. :D
Correção..
A última vez que vi no site do Aurélio ainda era somente comprando o livro, mais agora vi que ele disponibilizou no site dele o livro..
Tenta isso: