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.
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.
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.
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.
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 é.
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!";
}
?>
$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!!!
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>";
?>
$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.
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>
* {
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!

Entrar
Cadastre-se
Ajuda
Citar