Fórum WMO: Validação E Exibição De Ceps - Fórum WMO

Ir para

Página 1 de 1
  • Novo tópico
  • Responder
  • Ícone  Compartilhar

Validação E Exibição De Ceps Expressões Regulares - ER

#1 Membro offline   Klaus 

  • @ ubuntu jaunty
  • Ícone
  • Grupo: Ex-Admins
  • Posts: 7.924
  • Cadastrado: 08/02/2004
  • Sexo:Masculino
  • Localidade:127.0.0.1
Pontos: 0
Neutral

Ícone  Postou 30/04/2005, 19:52

Fala galera!

Hoje tenho um artigo que usa algumas funções do PHP mas, principalmente, expressões regulares. Minha idéia com isso é disseminar o uso das expressões. =) Vamos lá!

Dificuldade: ♥♥♥♥♥♥♥♥♥♥ - Eita avaliação aboyolada... hahahahaha
Ao som de: Bruno e Marrone - Trânsito Parado

Antes de mais nada, você deve saber o que são as expressões regulares (ER), caso ainda não saiba:

http://guia-er.sourceforge.net/ (Leia, não clique somente)

Antes ainda, rs, você deve conhecer duas funções do PHP: preg_match e preg_replace.

preg_match verifica se uma ER casa (retorna true) ou não casa (retorna false).

preg_replace substitui (casando por ER) uma parte da string por outra.

Saiba tudo sobre as funções:

http://www.php.net/preg-match
http://www.php.net/preg-replace

Vamos a diversão!

-----

Bom, como eu sei que você leu o link sobre ERs que lhe passei, então não preciso explicar o básico sobre ERs. :D

Veja a ER que usaremos neste artigo para casar CEPs:

Citar

^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$


Calma, não fique excitado. É grande mas não é de comer. :D

A primeira coisa que digo é: Os parênteses são opcionais para a validação então vamos descartá-los.

Citar

Oxe Klaus... Vai a fezes, pra que você colocou eles então?

Eles são úteis na exibição formatada.


Parte 1:

Citar

^ e $


Como você deve ter lido no link que lhe passei, o ^ e a $, indicam o início e o fim da expressão, como é um CEP, obviamente deve-se começar e terminar com números.

Parte 2:

Citar

[0-9]{2})\.?


[0-9] é um intervalo numérico, ou seja, só números. {2} Indica que devem aparecer exatamente 2 números. \.? indica um ponto literal que pode aparecer uma vez ou não (efeito do ?). A barra invertida antes do . existe para tirar o efeito especial do mesmo, que você já deve saber qual é. :D

Parte 3

Citar

[0-9]{3})-?


Praticamente igual ao anterior, porém desta vez queremos três números, seguidos, opcionalmente, de um -.

Parte 4

Citar

[0-9]{3}


O mais fácil de todos, três números em sequência.

Vamos ler a ER novamente?

Citar

^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$


Citar

No início da string dois números seguidos, opcionalmente, por um ., seguido  por três outros números seguidos, opcionalmente, por um -, seguido por três números


Bico não?

Agora vamos converter isso em uso no PHP:

Citar

<?php

  $cep = $_POST["cep"]; // Suponhamos que você recebe o CEP de um formulário qualquer...

  $r = "/^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$/"; /* Note a presença de / no começo e no fim da ER, isso ocorre pelo fato das ERs no estilo Perl necessitarem de delimitadores... */
   
  if ( preg_match ($r, @$_GET["cep"]) ) {
    echo "A expressão casa!";
  }
  else {
    echo "A expressão não casa!";
  }

?>


Pronto. Fácil não?

Citar

Klaus... cadê a parte de exibir formatado?

OK, vamos nessa, segura cowboy!!!


-----

A parte de exibir formatada é muito simples, desde que você tenha entendido o conceito de retrovisores do tutorial.

Leia novamente: http://guia-er.sourc...guia-er-26.html

A diferença é que aqui usamos o retrovisor com duas barras invertidas, assim: \\1.

Veja como é fácil exibir formatado: (acrescentando ao código anterior)

Citar

<?php

  $cep = $_POST["cep"]; // Suponhamos que você recebe o CEP de um formulário qualquer...

  $r = "/^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$/"; /* Note a presença de / no começo e no fim da ER, isso ocorre pelo fato das ERs no estilo Perl necessitarem de delimitadores... */
   
  if ( preg_match ($r, @$_GET["cep"]) ) {
    echo "A expressão casa!";
  }
  else {
    echo "A expressão não casa!";
  }

  echo "<p>" . preg_replace ($r, "\\1.\\2-\\3", $cep) . "</p>";

?>


Os parênteses que eram opcionais no momento da validação, são estrategicamente posicionados quando se trata da exibição. :D

Para facilitar seus testes com ERs (nessa ou em qualquer outra), um script que facilita os testes:

Citar

<style type="text/css">

  * {

    font: 10pt verdana;

  }

</style>

<?php

    $r = "/^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$/";
   
    if ( preg_match ($r, @$_GET["q"]) ) {
        echo "A expressão casa!";
    }
    else {
        echo "A expressão não casa!";
    }
   
    echo "<p>" . preg_replace ($r, "\\1.\\2-\\3", $_GET["q"]) . "</p>";

?>

<p><button id="testa" onclick="novaVerificacao();">Nova Validação</button></p>

<script language="javascript" type="text/javascript">

    function novaVerificacao() {

        var q = window.prompt ("Digite o novo valor para teste na expressão regular: <?php echo $r; ?>");
       
        window.location.href = window.location.pathname + "?q=" + q;

    }
   
    document.getElementById("testa").focus();

</script>


-----

Abraços galera!
Klaus Paiva
Conheça também: Taperás
0

#2 Membro offline   Paulo Freitas 

  • ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××
  • Ícone
  • Grupo: Ex-Admins
  • Posts: 5.612
  • Cadastrado: 12/09/2004
  • Sexo:Masculino
  • Localidade:Campinas - SP
Pontos: 62
Excellent

Ícone  Postou 30/04/2005, 20:00

Vish... a fera voltou ... :P

À cada 10 tutoriais seus que leio, 11 eu aprendo ... :rolleyes: :P

Valew!!! Já sabia um pouco de preg_match(), graças ao Justice ... agora sei mais um pouco ... :)

Tuto nota 10!!! (y)

Flw's, T+V! :D Até mais
0

#3 Membro offline   Wagner Bianchi 

  • SQL MAGAZINE
  • Ícone
  • Grupo: Usuários
  • Posts: 323
  • Cadastrado: 16/09/2003
  • Sexo:Não informado
  • Localidade:Belo Horizonte/MG
  • Interesses:MySQL, PHP, XML, JAVA SCRIPT, DHTML, LINUX, C, C++
Pontos: 0
Neutral

Postou 01/05/2005, 20:00

Olá,


Putzzz. . .assim,muito bom hein cara. . .

Parabéns, quando eu crescer quero ser igual a vc e um tal Guilherme Blanco aí. . .ehehehehe


Abraço!


Wagner Bianchi
<?php

$know_that = "para aprender";
$reason = "DEUS";
$greeting = "Muito prazer, sou Wagner Bianchi!";
$mail = "wagnerbianchi@yahoo.com.br";
echo "Tenha " . $reason . " e humildade " . $know_that . "!<BR>";
echo "$greeting<BR>";
echo "$mail<BR>";

?>
0

#4 Membro offline   Xandão Grunge 

  • 12 Horas
  • Ícone
  • Grupo: Usuários
  • Posts: 158
  • Cadastrado: 14/10/2003
  • Sexo:Não informado
  • Localidade:Chavantes
Pontos: 0
Neutral

Postou 10/06/2005, 14:10

O link que explica as Expressões regulares não está funcionando :(
Xandão Grunge B)
0

#5 Membro offline   Klaus 

  • @ ubuntu jaunty
  • Ícone
  • Grupo: Ex-Admins
  • Posts: 7.924
  • Cadastrado: 08/02/2004
  • Sexo:Masculino
  • Localidade:127.0.0.1
Pontos: 0
Neutral

Postou 10/06/2005, 14:13

Qual? Esse: http://guia-er.sourceforge.net/? Acabei de testar... OK!
Klaus Paiva
Conheça também: Taperás
0

#6 Márcio Pereira

  • Grupo: Visitantes
Pontos: 0

Ícone  Postou 21/06/2006, 15:46

Eu sou novato em php e mais ainda em Expressões Regulares. Estou tentando implementar a seguinte expressão regular, tá quase lá mas a minha dificuldade é na var $size. Eu gostaria de saber como posso guardar o valor casado no retrovisor 4 da expressão abaixo (eu tentei $tamanho = "\\4"; mas tá pegando o valor literal 4 e não o valor casado na expressão...) ou ainda se posso jogar ele direto na função (tentei assim $size = humanize_size(\\4); mas não funcionou).

function xoopsCodeDecode( $text, $allowimage = 1 )
{
	$patterns = array();
	$replacements = array();	

	$patterns[] = "#(^|(?<=[^\w\"']))(ed2k://\|file\
|([^\\/\|:<>\*\?\"]+?)\|(\
d+?)\|([a-f0-9]{32})\|(.*?)/?)(?![\"
'])(?=([,\.]*?[\s<\[])|[,\
.]*?$)#i";
	$tamanho = "\\4";
	$size = humanize_size($tamanho);
	$replacements[] = "<a href='http://www.emugle.com/details.php?f=\\5' target='_blank'><img src='http://www.mistershare.org/home/images/misc/emugle-icon.gif' border='0'></a> <img src='http://www.mistershare.org/home/images/misc/emule.gif' border='0'> <a href='\\2'>\\3 <b>($size)</b></a>";

	return preg_replace($patterns, $replacements, $text);
}



Qualquer ajuda é muito bem-vinda.
0

#7 Membro offline   Paulo André 

  • Why so serious?
  • Ícone
  • Grupo: Ex-Admins
  • Posts: 5.114
  • Cadastrado: 07/01/2004
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?
Pontos: 18
Good

Postou 21/06/2006, 16:04

O retrovisor deveria estar dentro da variável $replacements. Porque colocando em $tamanho, nada mais é do que uma string.

Flws...
;) Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br
0

#8 Membro offline   Felipe Pena 

  • O temor do Senhor é o princípio da sabedoria
  • Ícone
  • Grupo: Ex-Admins
  • Posts: 6.439
  • Cadastrado: 09/04/2004
  • Sexo:Masculino
  • Localidade:Rio de Janeiro
Pontos: 17
Good

Postou 22/06/2006, 10:06

Para usar uma função no argumento responsável pela modificação, você precisa primeiro utilizar o modificador 'e'.

Exemplo:
print preg_replace('/[[:alpha:]]+/e', "strtoupper($0)", 'abc!');


Informação sobre outros modificadores:
http://www.phpavancado.net/node/258
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29
0

Página 1 de 1
  • Novo tópico
  • Responder

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)