Caminho de Navegação Sistema de usuários / Scripts / Validação de Formulários com Expressões Regulares

1 avaliação
Indique ao Ueba Indique ao BlogBlogs Indique ao Delicious Indique ao Technorati Indique ao Google Bookmarks Indique ao Newsgator
TAGS
  • Máximo de 100 tags
  • Cada tag deve ter até 20 caracteres.
  • Separar as tags com virgula. Ex.: php, sql, html, xml, fireworks
COMENTAR

INDICAR
Nome do amigo: E-mail do amigo: Comentário:
REPORTAR ERRO Descreva o erro:

Validação de Formulários com Expressões RegularesPostada em: 10/09/2009

Bruno Rios
Por: Bruno Rios Nº de Visualizações: 1938. Compatível: Apache 1.x Apache 2.x FF 1.x FF 2.x FF 3.x IE 5.5 IE 6 IE 7 IE 8 MySQL 4 MySQL 5 Opera 8 Opera 9 PHP 4 PHP 5 Safari 3


E aí pessoal, vou começar postando com algo, que acho que é de interesse geral e de suma importância para um código seguro.

** Validação com Expressões Regulares. **

Para início de conversa vamos apresentar aos mais iniciantes, uma função do php que irá nos ajudar muito.

** ereg() == Essa função possui 3 parâmetros, sendo o 3º opcional ==> ereg($expressaoRegular, $string, $matrizExpReg);

... Aqui vamos dar mais ênfase aos 2 primeiros, pois o terceiro é uma matriz gerada por substrings da expressão regular.

... O 1º parâmetro ($expressaoRegular) é a espressão regular a ser usada na validação da string, 2º parâmetro ($string). Ou seja, a string ($string) para ser validada precisa se enquadrar nas condições da expressão regular ($expressaoRegular).

Veja o exemplo:


                                $nome = Bruno
                                if (ereg('^[a-zA-Z]{3,50}$', $nome)){
                                        $sucesso = "Parabéns você digitou seu nome corretamente".
                                }else{
                                        $erro = "Opss.. Seu nome está incorreto!".
                                }
 

Explicando:
Na expressão regular acima nós colocamos a seguinte condição:
- Na string $nome só poderá conter letras, tanto minúsculas quanto maiúsculas;
- Além de só poder ter letras, ela deverá ter no mínimo 3 caracteres e no máximo 50.

Para ficar mais fácil:
^ == significa o início da string;
$ == significa o fim da string;
[a-zA-Z] == significa que só pode conter letras, tanto minúsculas quanto maiúsculas;
{3,50} == significa que a string deverá ter no mínimo 3 caracteres e no máximo 50.

Dica:
O PHP tem uma maneira bem fácil de ignorar as letras maiúsculas ou mnúsculas, ou seja se tornar case insensitive. Basta colocar o i diretamente na função. Usando o mesmo exemplo acima ficaria assim:

                                $nome = Bruno
                                if (eregi('^[A-Z]{3,50}$', $nome)){
                                        $sucesso = "Parabéns você digitou seu nome corretamente".
                                }else{
                                        $erro = "Opss.. Seu nome está incorreto!".
                                }
 

Observe que trocamos ereg por eregi, e com isso podemos retirar ou a condição de verificação a-z ou a A-z, pois basta uma para ele fazer a verificação, já que não haverá distinção de maiúsculas e minúsculas.


Veja abaixo um exemplo completo e com várias validações:

       
                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                        <html xmlns="http://www.w3.org/1999/xhtml">
                        <head>
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                        <title>Expressões Regulares</title>
                        </head>

                        <body>

                        <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
                        Texto: <input type="text" name="texto" value="<?php echo isset($_POST['texto']) ? $_POST['texto'] : "" ?>
">
                        <input type="submit" value="Aperte o botão !">
                        </form>

                        <!--
                        OBSERVAÇÃO:
                                          * Veja que coloquei -- echo $_SERVER['PHP_SELF']; -- no action do form para o form ser enviado para a mesma página.
                                          * Coloquei também -- echo isset($_POST['texto']) ? $_POST['texto'] : "" -- no value do input para após o post acontecer retornar o valor do próprio post caso ele possua valor ou retorne vazio, caso não tenha valor no post

                        -->


 


                        <?php

                        $texto = $_POST['texto'];

                        if (isset($_POST['texto'])) {
                        echo "O texto digitado:<br />";
                        echo "<div><p>";
                        echo (ereg("a", $_POST['texto']) ? "tem ao menos uma letra a minúscula" :"não tem nenhuma letra a minúscula") . "<br />";
                        echo (ereg("^a", $_POST['texto']) ? "" : "não ") . "inicia com a letra a <br />";
                        echo (ereg("a$", $_POST['texto']) ? "" : "não ") . "termina com a letra a<br />";
                        echo (eregi("php", $_POST['texto']) ? "" : "não ") . "inicia com as letras php, maiúsculas ou minúsculas<br />";
                        echo (eregi("^php", $_POST['texto']) ? "" : "não ") . "inicia com as letras php, maiúsculas ou minúsculas<br />";
                        echo (ereg("^[0-9]", $_POST['texto']) ? "" : "não ") . " inicia com um número <br />";
                        echo (ereg("^[a-g]", $_POST['texto']) ? "" : "não ") . " inicia com uma letra entre 'a' e 'g' minúscula<br />";
                        echo (eregi("^[a-g]", $_POST['texto']) ? "" : "não ") . " inicia com uma letra entre 'a' e 'g' , maiúscula ou minúscula<br />";
                        echo (ereg("^[a-gA-G]", $_POST['texto']) ? "" : "não ") . " inicia com uma letra entre 'a' e 'g' , maiúscula ou minúscula<br />";
                        echo (ereg("^[0-9]$", $_POST['texto']) ? "" : "não ") . " é um número de 1 dígito apenas<br />";
                        echo (ereg("^[0-9][0-9]$", $_POST['texto']) ? "" : "não ") .    " é um número de 2 dígitos apenas<br />";
                        echo (ereg("^[0-9]+$", $_POST['texto']) ? "" : "não ") .        " é um número com pelo menos 1 dígito<br />";
                        echo (ereg("^[0-9]$", $_POST['texto']) ? "" : "não ") . " é um número com exatamente 4 dígitos<br />";
                        echo (ereg("^[0-9a-zA-Z]$", $_POST['texto']) ? "" : "não ") . " se compõe de exatamente 6 números e letras (não se aceitam símbolos ou pontuações)<br />";
                        echo "</div></p>";

                        /*
                          OBSERVAÇÕES:
                                * Para os mais iniciantes a expressão:
                                        ($condicao ? $retornoVerdadeiro : $retornoFalso);
                                É uma pequena abreviação de um if().
                                Exemplo:
                                        if ($condicao){
                                                $retornoVerdadeiro;
                                        }else{
                                                $retornoFalso;
                                        }
                                O exemplo acima é a mesma coisa que ($condicao ? $retornoVerdadeiro : $retornoFalso);
                        */


                        echo "<div><p>";
                        echo (ereg("a+b+", $texto) ? "" : "não "). "tem um ou mais 'a' seguido por um ou mais 'b'<br />";
                        echo (ereg("a+b*c+", $texto) ? "" : "não "). "tem um ou mais 'a' seguido por zero ou mais 'b' seguido por um ou mais 'c'<br />";
                        echo (ereg("a+b?c+", $texto) ? "" : "não "). "tem um ou mais 'a' seguido por zero ou um 'b' seguido por um ou mais 'c'<br />";
                        echo (ereg("^a+b?c+", $texto) ? "" : "não "). "inicia com um ou mais 'a' seguido por zero ou um 'b' seguido por um ou mais 'c'<br />";
                        echo (ereg("a+bc+$", $texto) ? "" : "não "). "finaliza com um ou mais 'a' seguido por exatamente três 'b' seguido por um ou mais 'c'<br />";
                        echo (ereg("^a+b{4,6}c+", $texto) ? "" : "não "). "inicia com um ou mais 'a' seguido por quatro a seis 'b' seguido por um ou mais 'c'<br />";
                        echo (ereg("^a+b{3,}c+", $texto) ? "" : "não "). "inicia com um ou mais 'a' seguido por três ou mais 'b' seguido por um ou mais 'c'<br />";
                        echo (ereg("^a+(php){3,}c+", $texto) ? "" : "não "). "inicia com um ou mais 'a' seguido por três ou mais 'php' seguido por um ou mais 'c'<br />";
                        echo (eregi("^[a-z0-9]+@[a-z0-9]*$", $texto) ? "" : "não "). "inicia com um ou mais caracteres seguido por um '@' seguido por zero ou mais caracteres<br />";
                        echo (eregi("^[a-z0-9]+@(php|perl)$", $texto) ? "" : "não "). "inicia com um ou mais caracteres seguido por um '@' seguido por 'php' ou 'perl'<br />";
                        echo (eregi("f.w", $texto) ? "" : "não "). "tem um 'f' seguido por um caracter qualquer seguido por um 'w'<br />";
                        echo "</div></p>";
                        }else{
                        echo "<div><p>";
                        echo "Digite algo na caixa de texto...";
                        echo "</div></p>";
                        }
                        ?>

                        </body>
                        </html>
 



O código acima mostra mais alguns símbolos utilizados nas expressões regulares:

* * == significa zero ou mais (lembre-se que + significa um ou mais)
* ? == significa zero ou um
* { } == as chaves podem ter número mínimo ou máximo de ocorrências
* ( ) == parênteses significam uma sequência exata de caracteres
* | == significa "ou"
* . == significa qualquer caractere (inclusive símbolos)

Não podemos esquecer também que para usar caracteres especias devemos sempre utilizar a barra invertida ('\').



Em seguida estou enviando algumas validações muito usadas no dia-a-dia:

Data:


        echo (ereg("^[0-9]/[0-9]/[0-9]", $texto, $regs) ? "" : "não "). "é uma data no formato DD-MM-AAAA<br />";
 


E-email:

        echo (eregi("^[_-.0-9a-z]+@[_-.0-9a-z]+$", $texto) ? "" : "não "). "é um e-mail válido (aceita letras, números, '_', '-' e '.'<br />";
 


CNPJ:

        echo (ereg("^[0-9].[0-9].[0-9]/[0-9]-[0-9]$", $texto) ? "" : "não "). "é um CNPJ válido (exemplo: 12.345.678/0001-95 (dígito verificador não calculado)<br />";
 


CPF:

        echo (ereg("^([0-9].)[0-9]-[0-9]$", $texto) ? "" : "não "). "é um CPF válido (exemplo: 123.456.789-09 (dígito verificador não calculado)<br />";
 


Nome:

        echo (ereg("^([a-zA-Zà-üÀ-Ü0-9'.]+[ ]?)+$", $texto) ? "" : "não "). " é um nome correto. <br />";
 


RG:

        echo (ereg("^[0-9].[0-9].[0-9]-[0-9]$", $texto) ? "" : "não "). "é um RG válido. Formato: 12.345.678-9 (dígito verificador não calculado)<br />";
 


CEP:

        echo (ereg("^[0-9].[0-9]-[0-9]$", $texto) ? "" : "não "). "é um CEP válido. Formato: 12.345-678<br />";
 


TELEFONE:

        echo (ereg("^([0-9])[0-9]-[0-9]$", $texto) ? "" : "não "). "é um TELEFONE válido. Formato: (21)1234-5678<br />";
 


É isso aí galera, se gostaram é só copiar o código e usar, e de preferência...
** Comentem...
** Votem... e
** Indiquem!!
felipe antunes
Enviado por felipe antunes em 28 de setembro de 2009 Bela explicação.