quarta-feira, janeiro 23, 2008

Validando em PHP Expressões Regulares

Trabalhar com PHP é fácil, pois ele é poderoso e simples.

Para você fazer um teste se uma variável possui o padrão que você deseja (máscara), basta usar a função ereg ou eregi, que retorna TRUE (corresponde) ou FALSE (não corresponde)
A função ereg é case sensitive, ou seja, diferencia maiúsculas de minúsculas; já a eregi ignora essa diferença.

Exemplo:

$meus = (isset($_GET['meus'])) ? trim($_GET['meus']) : '';
if (ereg("[^a-zA-Z]",$meus)) {
$meus = '';
}

Acima eu verifico se a variável $_GET['meus'] foi inicializada; se sim atribuo ela à minha variável meus, senão atribuo vazio. Depois (eu poderia colocar junto com a verificação acima, mas assim fica mais fácil de enxergar) eu verifico se a variável é composta somente por letras. Sepossuir em seu conteúdo algo "não letra" (o não é simbolizado pelo "^" no início do bloco entre colchetes), atribuo vazio à variável (se for composta por letras... mantenho ela como está).
Poderíamos usar a eregi, que funciona igualzinho, apenas com a diferença que falei anteriormente.

Seguem uma função que uso para validar variáveis. Dá para ser incrementada e modificada, por isso, poste aqui se fizer algum melhoramento!

function validarCampo($str,$tipo,$tam) {
$padrao = '';
if (strlen($str)<=0) {return FALSE;}
if (!is_numeric($tam)) {return FALSE;}
if (strlen($str)>$tam) {return FALSE;}
if ($tipo=='n1') { $padrao = '^[0-9]+$'; } //numerico
if ($tipo=='n2') { $padrao = '^[0-9 ]+$'; } //numerico com espaços
if ($tipo=='fl') { $padrao = '^[+-]?(([0-9]+|[0-9]{1,3}(\.[0-9]{3})+)(\,[0-9]*)?|\,[0-9]+)$'; } //float
if ($tipo=='a1') { $padrao = '^[A-Za-zÀ-ú]*$'; } // alfa
if ($tipo=='a2') { $padrao = '^[A-Za-zÀ-ú0-9\&\; ]*$'; } // string - alfanumerico
if ($tipo=='a3') { $padrao = '^[A-Za-z0-9]*$'; } // string - alfanumerico sem acentuação
if ($tipo=='a4') { $padrao = '^[A-Za-zÀ-ú0-9@#%!&\*\?\)\(\$\}\{\+\.\-\,\;\: ]*$'; } // string - alfanumerico com caracteres especiais
if ($tipo=='a5') { $padrao = '^[A-Za-zÀ-ú0-9@#%!&\*\?\)\(\$\}\{\+\.\-\_\,\;\:\n\r ]*$'; } // string - alfanumerico com caracteres especiais
if ($tipo=='ht') { $padrao = '^[A-Za-zÀ-ú0-9@#%!&\*\?\)\(\$\}\{\+\.\-\_\,\;\:\n\r\<\>\/ ]*$'; } // caracteres de um trecho HTML
if ($tipo=='em') { $padrao = '^[0-9a-zA-Z]+[\_\-\.]?[0-9a-zA-Z]+@(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9]\.)+[A-Za-z]{2,6}|\[[0-9]{1,3}(\.[0-9]{1,3}){3}\])$'; } //email
if ($tipo=='u1') { $padrao = '^((ht|f)tp(s?)\:\/\/|~\/|\/){1}([0-9a-zA-Z]+:[0-9a-zA-Z]+@)?([a-zA-Z]{1}([0-9a-zA-Z-]+\.?)*(\.[0-9a-zA-Z]{2,5}){1})$'; } //url
if ($tipo=='u2') { $padrao = '^((ht|f)tp(s?)\:\/\/|~\/|\/){1}([0-9a-zA-Z]+:[0-9a-zA-Z]+@)?(([a-zA-Z]{1}([0-9a-zA-Z-]+\.?)*(\.[0-9a-zA-Z]{2,5}){1})(:[0-9]{1,5})?)?((\/?[0-9a-zA-Z_-]+\/)+|\/?)([0-9a-zA-Z]+([0-9a-zA-Z_-]?[0-9a-zA-Z]+)?\.[0-9a-zA-Z]{3,4})?([,][0-9a-zA-Z]+)*((\?[0-9a-zA-Z]+=[0-9a-zA-Z]+)?(&[0-9a-zA-Z]+=[0-9a-zA-Z]+)*([,][0-9a-zA-Z]*)*)?$'; } //url com subpasta e arquivo
if ($tipo=='t1') { $padrao = '^[0-9]{10}$'; } //telefone com DDD
if ($tipo=='t2') { $padrao = '^[0-9]{12}$'; } //telefone com DDD e país
if ($tipo=='t3') { $padrao = '^[0-9]{2} [0-9]{2} [0-9]{4}\-[0-9]{4}$'; } //telefone com DDD e país formatado 55 13 9999-9999
if ($tipo=='t4') { $padrao = '^0800[0-9]{6,7}$'; } //telefone 0800 sem espaços (080000(0)0000)
if ($tipo=='t5') { $padrao = '^0800\-[0-9]{2,3}\-[0-9]{4}$'; } //telefone 0800 formatado 0800-00(0)-0000
if ($tipo=='ip') { $padrao = '^[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3}$'; } //ip
if ($tipo=='mo') { $padrao = '^\[0-9]{1,3}(\.[0-9]{3})*\,[0-9]{2}$'; } //moeda
if ($tipo=='d1') { $padrao = '^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$'; } //data no formato DD/MM/AAAA
if ($tipo=='d2') { $padrao = '^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$'; } //data no formato AAAA/MM/DD
return ereg($padrao,$str);
}

Essa função recebe uma valor (uma string), um tipo de campo para validar e um tamanho máximo que este valor pode ter. Se não bate com o padrão ou for maior que o tamanho permitido, retorna FALSE.
Ela usa padrões de formatação também, como por exemplo "/" para data. Poderíamos usar "/" ou "-". Ficaria algo como '^[0-9]{4}[\/\-][0-9]{2}[\/\-][0-9]{2}$'. Aí vai do gosto do freguês.

Obs: o caractere "^" no início da expressão, indica que ela deve começar com aquele padrão, e o caractere "$" indica que deve terminar com o padrão também. Nesses casos, o conteúdo da variável deve seguir exatamente o padrão estipulado em seu todo. Se não colocássemos estes caracteres, esse padrão poderia ocorrer em qualquer lugar do campo/variável.
Se o caractere "^" aparecer dentro de um bloco "[]", ele significa NÃO.

Os que demoraram mais, através de pesquisas e ajustes foi criação (se assim posso dizer) do padrão de URL e o de e-mail, porque nos testes sempre aparecia algo novo... por isso, qualquer falha em qualquer padrão avise/comente!

Um bom guia é http://guia-er.sf.net, do Aurélio.

Abraço!!!