segunda-feira, 2 de julho de 2012

Funções MultiByte, acentuação no PHP para todos.

Tentando  converter dados de um formulário HTML em upper case para gravar em um banco MYSQL,
passei horas de muito aperto lidando strtoupper.

Com pesar descobri que os caracteres acentuados permaneciam da mesma forma, e assim conseguia algo do tipo:

transformação   ->  TRANSFORMAçãO (note o 'çã' minúsculo)

Procurando, cheguei à informação de que era necessário ajustar o local com  a função setlocale().

Outro tempo gasto, muitos testes e nada.

Por fim encontrei as Funções MultiByte, que consideram os caracteres acentuados em vários idiomas.

Dessa forma, podemos simplesmente escrever:


<?php

    $letras= 'á é í ó ú ç ã õ â ê ô ü à è ò';

    echo mb_strtoupper($letras,'utf-8');
 
 ?>

 Resultado:  Á É Í Ó Ú Ç Ã Õ Â Ê Ô Ü À È Ò

Estas funções diferem pelo sufixo mb_ no nome. Existe equivalente para muitas funções que trabalham com
strings.

Por exemplo:

    mb_strlen — Comprimento da string
    mb_strpos — Acha a POSIÇÃO da primeira ocorrência de uma string em outra
    mb_strrpos — Acha a posição da ultima ocorrência de uma string em outra
    mb_strstr — Acha a primeira OCORRÊNCIA de uma string em outra
    mb_strtolower — transforma uma string em minúsculas
    mb_strtoupper — Transforma em maiúsculas
    mb_substr — Pega uma parte da string
    mb_substr_count — Conta o numero de ocorrências de uma substring em uma string

Para uma lista mais abrangente olhe em Multibyte String Functions

Então atéa próxima.

sexta-feira, 8 de junho de 2012

Validador PHP de Expressões Regulares

 

Olá o assunto hoje é Expressão Regular no PHP.

Talvez você, assim como eu, já quis facilitar seu trabalho de programação na hora de validar um campo, seja ele CPF, CNPJ entre outros. O caminho, via de regra, é "if s intemináveis", aquele monte de comparação, para cada tipo de caracter, etc. Ou aquelas equações cheias de {}[]()/.\/ entre outros símbolos que assustam.
Bom, me assustei bastante, mas continuei, insisti e vi que era legal. Então vou tentar compartilhar um pouco do apreendido com as experiências, e mais, acabei por construir um simples, mas útil Validador de Expressões Regulares. 

Expressão Regular é algo que lhe permite diminuir para uma linha uma dezena de IFs. Pra compreender o que é, existe o  EXCELENTE LIVRO DO AURÉLIO MARINHO gratuito e online. 

O Projeto é bastante simples e consiste de duas páginas php. 

Aqui você pode testá-lo:  Projeto no Ar

Pra executar em modo local, na sua máquina, é necessário ter o PHP e o Apache configurados, e pra quem ainda não tem recomendo o WAMPSERVER, que instala e configura tudo pra você. 

Como editor de texto você pode usar até o bloco de notas, mas existem alguns que lhe facilitam demais a vida. O que costumo usar é o Notepad++ que além de permitir a sintaxe PHP,  também é gratuito. Outra característica muito interessante pra quem faz sites compatíveis com UTF-8 é a opção de  formatar e salvar o arquivo já nesse formato, para que as palavras com acento apareçam corretamente.

Links:

FONTES DO PROJETO

Você já deve ter procurado muito sobre esse assunto na internet, de forma que serei breve e passarei ao código fonte.

Para utilizar, abra o Notepad++, menu Formatar e  marque "Codificação em UTF-8 (sem BOM)", com isso as palavras sairão acentuadas corretamente. Isso é necessário porque estou especificando no < head > esse charset.

Cole o conteúdo do arquivo abaixo e salve-o como INDEX.PHP. Repita para o EXP_REG.PHP.

Salve ambos na pasta www que o WAMPSERVER criou pra você, ela deve estar em: C:\wamp\www\

Agora, entre no seu navegador  e digite: LOCALHOST/INDEX.PHP



Este arquivo é o INDEX.PHP


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="title" content="Validador de Expressões Regulares">
  <meta name="description" content="Valida expressões regulares">
  <meta name="keywords" content="validador,expressões regulares,php">
  <meta name="autor" content="Claudio Segura">
  <meta name="revisit-after" content="15">
 
  <style type="text/css">
    #formulario {
        background-color: #61B5D4;
        float:left;
    }   
    #formulario h1{
        font: bold 20px Trebuchet Ms, Verdana, Arial, Tahoma, Sans-Serif;
        color: #426B00;
        text-transform:uppercase;
        text-align: center;
        margin-top: 7px;
    }
   
    #corpo {
        clear:both;
        background-color: #AAAA77;
       
    }
    #corpo h3{
        font: bold 14px Trebuchet Ms, Verdana, Arial, Tahoma, Sans-Serif;
        color: #426B00;
        text-transform:uppercase;   
    }
    #corpo p{
        font: 14px/20px   Arial,Tahoma, Sans-Serif;
        color: #164348;
        margin-botton:0px;    
       
    }
    #exemplo1{
        float:left;   
        margin-left: 20px;   
    }
    #exemplo2{
        float:left;   
        margin-left: 20px;
    }
  </style>
</head>

<body>

    <div id="formulario">
        <table border=1><tr><td>
        <h1>Validador PHP de Experessões Regulares</h1>
        <form method="post" action="exp_reg.php">
           
            <fieldset>
                <p><label><Input type = 'Radio' Name ='tipo' value= 'match'>Preg_match (Encontrar uma coincidência no texto)</label></p>
                <p><label><Input type = 'Radio' Name ='tipo' value= 'replace'>Preg_replace (Encontrar no texto e substituir pelo conteúdo)</label></p>
                Escolha do menu a Expressão Regular
                <select name="dropdown" value="options">
                    <option value="">Digitar uma expressão</option>
                    <option value="(^([\d]|1[0,1,2])/([0-9]|[0,1,2][0-9]|3[0,1])/\d{4}$)">Data</option>
                    <option value="(^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$)">Email</option>
                    <option value="(\b([0-9]{3}\.?){3}\-?[0-9]{2}\b)">CPF</option>
                    <option value="(\b([0-9]{2}\.?)([0-9]{3}\.?){2}\/?([0-9]{4})\-?([0-9]{2})\b)">CNPJ</option>
                    <option value="(\b[0-9]{2}\.?[0-9]{3}-[0-9]{3}\b)">CEP</option>
                </select>
                <p><label>ou digite uma Expressão: <input name="expressao" type="text" size="100"/></label></p>
                <p><label>Conteudo: <input name="conteudo" type="text" size="100"/></label></p>
                <p><label>Texto: <input name="texto" type="text" size="100"/></label>
               
            </fieldset>
           
            <p>

            <input type="submit" value="  Enviar  " name="submit">
            <input type="reset" value="  Limpar  " name="reset">

        </form>
        </td></tr></table>
    </div>
    <div id='corpo'>
        <div id='Exemplo1'>
            <p>Exemplo: preg_replace:</p>
            <h3>Retirar formatação de um CPF ou CNPJ:</h3>
            <p>Selecione: preg_replace</p>
            <p>Expressão: ([\.\-\/\' '])</p>
            <p>Conteúdo: deixe em branco equivale a ' '</p>
            <p>texto:12.234.345/0002-23</p>
            <hr>
            <h3>Formatar CPF:</h3>
            <p>Selecione: preg_replace</p>
            <p>Expressão: (([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{2}))</p>
            <p>Conteúdo: $1.$2.$3-$4</p>
            <p>texto:12234345023</p>
            <hr>
            <h3>Formatar CNPJ:</h3>
            <p>Selecione: preg_replace</p>
            <p>Expressão: (([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2}))</p>
            <p>Conteúdo: $1.$2.$3/$4-$5</p>
            <p>texto:12234345000134</p>
            <hr>
        </div>
        <div id='Exemplo2'>
            <p>exemplo: preg_match:</p>
            <h3>Procurar CPF:</h3>
            <p>Selecione: preg_match</p>
            <p>Expressão: Selecione do menu CPF</p>
            <p>Conteúdo: deixe em branco</p>
            <p>texto:01.234.567-89</p>
            <hr>
            <h3>Procurar CNPJ:</h3>
            <p>Selecione: preg_replace</p>
            <p>Expressão: Selecione do menu CNPJ</p>
            <p>Conteúdo: deixe em branco</p>
            <p>texto:12.234.345/0002-23</p>
            <hr>
               
        </div>
    </div>
   
   
   
</body>
</html>



Este outro é o  EXP_REG.PHP


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="title" content="Validador de Expressões Regulares">
  <meta name="description" content="Valida expressões regulares">
  <meta name="keywords" content="validador,expressões regulares,php">
  <meta name="autor" content="Claudio Segura">
  <meta name="revisit-after" content="15">
</head>

<body>

<?php

$expressao=$_POST['dropdown'];

if ($expressao==""){
    $expressao=$_POST['expressao'];
}

$conteudo=$_POST['conteudo'];
$texto=$_POST['texto'];



if ($_POST['tipo']=='match'){
    if (preg_match($expressao,$texto,$resp)){
        echo 'Expressão: '.$expressao;
        echo '<p>';
        echo 'Texto: '.$texto;
        echo '<p>';
        echo 'Resultado: [POSITIVO] - '.$resp[0].' encontrado';
    }else{
        echo 'Resultado: [NEGATIVO] - O texto não apresenta nada como a expressão sugere.';
    }
}else{
    $resp=preg_replace($expressao,$conteudo,$texto);
    echo 'Expressão: '.$expressao;
    echo '<p>';
    echo 'Conteúdo: '.$conteudo;
    echo '<p>';
    echo 'Texto: '.$texto;
    echo '<p>';
    echo 'Resultado: '.$resp;   
   
}

echo "<a href='index.php'>Retornar</a>";

?>

</body>
</html>


Bom então é isso. Bom divertimento.   :)