Jump to content



Photo

Validação E Exibição De Ceps


  • Please log in to reply
8 replies to this topic

#1 Klaus

Klaus

    @ ubuntu jaunty

  • Ex-Admins
  • 7924 posts
  • Sexo:Masculino
  • Localidade:127.0.0.1

Posted 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:

^([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.

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

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


Parte 1:

^ 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:

[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

[0-9]{3})-?


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

Parte 4

[0-9]{3}


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

Vamos ler a ER novamente?

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


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:

<?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?

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)

<?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:

<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!
  • 0
Klaus Paiva
Conheça também: Taperás

#2 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 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! :DAté mais
  • 0

#3 Wagner Bianchi

Wagner Bianchi

    SQL MAGAZINE

  • Usuários
  • 323 posts
  • Sexo:Não informado
  • Localidade:Belo Horizonte/MG
  • Interesses:MySQL, PHP, XML, JAVA SCRIPT, DHTML, LINUX, C, C++

Posted 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
  • 0
<?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>";

?>

#4 Xandão Grunge

Xandão Grunge

    12 Horas

  • Usuários
  • 158 posts
  • Sexo:Não informado
  • Localidade:Chavantes

Posted 10/06/2005, 14:10

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

#5 Klaus

Klaus

    @ ubuntu jaunty

  • Ex-Admins
  • 7924 posts
  • Sexo:Masculino
  • Localidade:127.0.0.1

Posted 10/06/2005, 14:13

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

#6 Márcio Pereira

Márcio Pereira
  • Visitantes

Posted 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 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 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
  • 0
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#8 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 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
  • 0
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#9 dud@

dud@

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 28/01/2012, 14:48

tenho o seguinte código abaixo de duas classes uma SHIPPING_CORREIOS que extends outra classe ISC_SHIPPING, só que esta classe utiliza eregi_replace que não se usa mais, não estou conseguindo alterar corremante, já tentei por preg_match, preg_replace (alguns exemplos que tentei: $sCepOrigem = preg_match("/^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$/"),$this->_origem); e $sCepDestino = preg_replace"('%^[ 0-9]%')","",$this->_origem);)
Amaria uma ajuda de quem tem domínio nestas funções, agradeço desde já.

Obs.: postei aqui por ser um tópico falando sobre essas funções utilizando no cep.

página module.cooreios.php:

<?php
class SHIPPING_CORREIOS extends ISC_SHIPPING
{

private $_deliverytype = "";


private $_destzip = "";


private $_deliverytypes = array();


public function __construct()
{

parent::__construct();
$this->_name = 'Correios';
$this->_image = "images.jpg";
$this->_description = 'Correios';
$this->_help = '';
$this->_height = 315;
$this->_countries = array("all");
$this->_showtestlink = false;
}

public function SetCustomVars()
{

$this->_variables['displayname'] = array(
'name' => 'Correios do Brasil',
'type' => 'textbox',
'help' => 'Modulo de Envio Correios',
'default' => $this->GetName(),
'savedvalue' => array(),
'required' => true);

$this->_variables['id'] = array("name" => 'ID',
"type" => "textbox",
"help" => 'Obs: apenas para clientes afiliados aos correios',
"default" => "",
"required" => false
);

$this->_variables['senha'] = array("name" => 'Senha',
"type" => "textbox",
"help" => 'Obs: apenas para clientes afiliados aos correios',
"default" => "",
"required" => false
);

$this->_variables['meios'] = array("name" => 'Formas',
"type" => "dropdown",
"help" => 'Formas de Entrega Ultilizados - Sem Senha: PAC, Sedex - Com Senha: Todos',
"default" => "no",
"savedvalue" => array(),
"required" => true,
"options" => array('PAC' => '41106',
'Sedex' => '40010',
'Sedex 10' => '40215',
'Sedex Hoje' => '40290',
'Sedex a Cobrar' => '40045',
'e-Sedex' => '81019',
'Malote' => '44105',
),
"multiselect" => true
);

}



private function GetQuote()
{

$this->SetCustomVars();

$this->_id = $this->GetValue("id");
$this->_senha = $this->GetValue("senha");

$this->_origem = GetConfig('CompanyZip');
$sCepOrigem = eregi_replace("([^0-9])","",$this->_origem);
$this->_destino = $this->_destination_zip;
$sCepDestino = eregi_replace("([^0-9])","",$this->_destino);
$this->_peso = number_format(max(ConvertWeight($this->_weight, 'kgs'), 0.1), 1);

switch($this->_deliverytype){
case'41106':
$tipo = "PAC";
break;
case'40010':
$tipo = "Sedex";
break;
case'40215':
$tipo = "Sedex 10";
break;
case'40290':
$tipo = "Sedex Hoje";
break;
case'40045':
$tipo = "Sedex a Cobrar";
break;
case'81019':
$tipo = "e-Sedex";
break;
case'44105':
$tipo = "Malote";
break;

}

$total = $count = 0;

if (isset($_SESSION['CART']['ITEMS'])) {
foreach ($_SESSION['CART']['ITEMS'] as $item) {
$total += $item['produto_price'] * $item['quantity'];
}
}
$total = str_replace('.',',',$total);
$correios ="http://ws.correios.c...ecoPrazo.aspx?"
."nCdEmpresa=".$this->_id."&"
."sDsSenha=".$this->_senha."&"
."sCepOrigem=".$sCepOrigem."&"
."sCepDestino=".$sCepDestino."&"
."nVlPeso=".$this->_peso."&"
."nCdFormato=1&"
."nVlComprimento=20&"
."nVlAltura=20&"
."nVlLargura=20&"
."sCdMaoPropria=N&"
."nVlValorDeclarado=".$total."&"
."sCdAvisoRecebimento=N&"
."nCdServico=".$this->_deliverytype."&"
."nVlDiametro=0&"
."StrRetorno=xml";
//inicia o curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $correios);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 2);
$html1 = curl_exec ($ch);
curl_close ($ch);
//pega o valor
$html = explode('<Valor>', $html1);
$html2 = explode('</Valor>', $html[1]);
$this->_shippingcost = str_replace(',','.',$html2[0]);
//pega o prazo
$pra = explode('<PrazoEntrega>', $html1);
$prazo = explode('</PrazoEntrega>', $pra[1]);

if($this->_shippingcost > "0") {
$newQuote = new ISC_SHIPPING_QUOTE($this->GetId(), $this->GetName(), $this->_shippingcost, $tipo);
return $newQuote;
}else{
return false;
}
}

public function GetServiceQuotes()
{
$this->ResetErrors();
$QuoteList = array();

// Get the selected delivery types
$delivery_types = $this->GetValue("meios");

if(!is_array($delivery_types) && $delivery_types != "") {
$delivery_types = array($delivery_types);
}

foreach($delivery_types as $delivery_type) {

$this->_deliverytype = $delivery_type;

// Next actually retrieve the quote
$err = "";
$result = $this->GetQuote($err);

// Was it a valid quote?
if(is_object($result)) {
$QuoteList[] = $result;
// Invalid quote, log the error
} else {
foreach($this->GetErrors() as $error) {
$GLOBALS['ISC_CLASS_LOG']->LogSystemError(array('shipping', $this->GetName()), $this->_deliverytypes[$delivery_type].": " .GetLang('ShippingQuoteError'), $error);
}
}
}

return $QuoteList;
}




public function GetTrackingLink($trackingLink = "")
{
return 'http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' . urlencode($trackingLink);
}
}
  • 0




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq