Continuando a série de artigos sobre validação de dados ( veja a primeira parte ) com PHP5.
Nota: usarei “cliente” para me referir a um usuário do sistema, ou mesmo outro sistema que interaja conosco. Usarei também ER para designar expressão regular, que é o assunto base deste post.
Anteriormente, havíamos abordado uma validação mais geral, onde tínhamos de aceitar vários tipos de dados.
Agora, vamos abordar uma situação onde esperamos um dado específico vindo do cliente – usarei “cliente” para referir tanto ao usuário do sistema quanto outros sistemas – por exemplo, em um campo de formulário, onde esperamos um nome ou um email.
Um dos recursos mais eficientes em se tratando de validação é o uso de expressões regulares. E é com isto que iremos trabalhar.
Vamos a uma definição:
“Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.” Fonte: Wikipédia.
Então uma expressão regular é um padrão. Por isso não podemos utilizar uma expressão regular para validar algo que desconhecemos, porque seria muito difícil ou mesmo impossível encontrar um padrão para tudo.
Não pretendo explicar os fundamentos de uma expressão regular, se desejar alguma referência, recomendo o site: http://guia-er.sourceforge.net
Como podemos utilizar uma expressão regular para validar um campo de um formulário? Precisamos de uma função do PHP que faça esta verificação para a gente, uma função que compare nossa expressão regular com o valor a ser testado.
O PHP oferece algumas funções para isso, vejamos duas delas:
ereg( string $expressão , string $variável [, array $registros ] )
Retorna TRUE se $variável “bater” com $expressão, e FALSE se a expressão não casar ou se acontecer algum erro. referência
//nossa ER, um padrão para CEP
$cepER = ‘^[0-9]{5}\-[0-9]{3}$’;
//vamos supor que temos a variável $_POST[‘cep’] vinda de um formulário
//fazemos então a verificação
if( ereg( $cepER, $_POST[‘cep’] ) )
echo “Isso parece um CEP válido”;
else
echo “Isso não é um CEP válido”;
Por que não podemos afirmar se o CEP está correto? Simplesmente porque com a ER analisamos apenas a forma da variável, ou seja, se ela tem o mesmo número de caracteres, se são do mesmo tipo e estão nas mesmas posições. Para afirmarmos com segurança que o CEP é válido, teríamos de verificar se o valor está cadastrado nos Correios ou em alguma outra fonte segura. Mas isso foge ao nosso escopo.
Essa função ereg permite fazer a buscar por um padrão em uma string utilizando padrão POSIX, mas o PHP fornece outra função para a mesma tarefa, com desempenho melhor, e baseado no padrão PCRE ( compatível com PERL ). Esta função é a preg_match.
preg_match( string $expressão , string $variável [, array &$matches [, int $flags [, int $offset ]]] )
Retorna 1 se a $variável “bater” com a $expressão, e 0 caso contrário. referência.
Vamos ver o uso do preg_match na mesma situação do exemplo anterior:
//nossa ER, um padrão para CEP
$cepER = ‘/[0-9]{5}\-[0-9]{3}/’;
//vamos supor que temos a variável $_POST[‘cep’] vinda de um formulário
//fazemos então a verificação, poderíamos omitir o “== 1”, já que o PHP converte 0 e 1 para false e true respectivamente
if( preg_match ( $cepER, $_POST[‘cep’] ) == 1 )
echo “Isso parece um CEP válido”;
else
echo “Isso não é um CEP válido”;
Notem a diferença na nossa ER. Mudamos os caracteres de inicio e final, isto acontece por conta da diferença entre os padrões que as funções utilizam.
O artigo já está muito grande, continuarei a falar sobre ER nos próximos artigos. Vamos ver como criar ER para validar telefone, email e por último CPF ( que incluiremos outro teste de validação além da ER ).
Uma última dica, utilizem ER juntamente com o método do artigo anterior, para aumentar a segurança de seu sistema ( pense em outras formas para isso também ).
Por enquanto é só.
Não esqueçam de validar tudo.