Mostrando postagens com marcador expressões regulares. Mostrar todas as postagens
Mostrando postagens com marcador expressões regulares. Mostrar todas as postagens

segunda-feira, abril 07, 2008

Validação de Texto com ER

Eu fiz uma postagem mostrando a função que eu uso para validar campos de acordo com seu conteúdo e tamanho máximo. Pesquisando um pouco mais, vi que as expressões regulares pecavam um pouco em alguns pontos, pois estava restringindo demais o conteúdo.
Como exemplo vou citar um site que fiz. Eu usei expressões regulares como essa: '^[A-Za-zÀ-ú0-9@#%!&\*\?\)\(\$\}\{\+\.\-\_\,\;\:\n\r ]*$'
Legal! Pega tudo! Mas ficou enorme, e analisando a tabela ASCII (usada nas expressões regulares quando usamos faiza de caracteres entre colchetes), pude observar que se eu pegar o intervalo entre exclamação e arroba (!-@) abrange todos esses caracteres:
! " #$ % & 1 ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
que são caracteres razoáveis para se aceitar em textos. Depois do arroba, vêm as letras maiúsculas, depois abra colchete, pipe, fecha colchete, circunflexo, underline, crase e depois as letras minúsculas. Esses caracteres entre as letras maipúsuclas e minúsculas eu prefiro deixar de fora, com exceção do underline '_'... Bom, resumindo, podemos simplificar a expressão regular sem causar perigo de aceitar caracteres como NULL, CR, LF, DEL, e assim colocar os caracters fora do comum que necessitar, como no meu caso o símbolo de libra '£' (o site era para o público inglês).
A expressão então para aceitar textos comuns ficaria:
'^[A-Za-zÀ-ÿ !-@\}\{\n\r£]*$'
Eu mudei o intervalo de À-ú para À-ÿ, pois não sei se certo idioma usa 'y' com acento. E no caso mantive a permissão para nova linha e retorno de carro. Obviamente você, após receber os caracteres aceitáveis, irá tratá-los. Eu costumo:
  • substrituir \n\r por somente \n
  • arranco as chaves, colchetes etc se não for usar
  • arranco tudo que possa prejudicar meu código: str_replace(Array(']','[','{','}','>','<',chr(34),chr(39)),'',$str);
  • arranco os apóstrofes e aspas se não precisar: str_replace(Array(chr(34),chr(39)),'',$str);
  • converto \n em <br />: ereg_replace("\r",'',ereg_replace("\n",'<br />',$str));
Mas lembre-se: não saia arrancando tudo. Se você receber um texto formatado com HTML, você não pode arrancar maior, menor e aspas.
Uma vez eu precisei salvar no PostgreSQL formatar os caracteres para jogar no Adabas pelo Mainframe. Então tive que substituir e colocar tudo em maiúsculo para ficar compatível. Fiz mais ou menos isso:
function noAccent($str) {
return strtr($str, "ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿºª", "SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy..");
}
function toMainframe($str) {
return strtoupper(noAccent(strip_tags($str)));
}

e aí
$str = toMainframe($str);
Bom, expressão regular é assim: você pode controlar tudo que você quer e não quer. AS funcções do PHP ajudam bastante, mas no caso foi um exemplo de uso que pode ser aplicado a qualquer linguagem que suporte ER.

Abraço!

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

segunda-feira, dezembro 24, 2007

Expressões Regulares

Esse é o melhor guia explicativo de expressões regulares: http://guia-er.sourceforge.net/ do Aurélio. E tem um livro com o mesmo conteúdo... Ajude-o!

Estou postando isso porque eu sempre olho esse guia e nunca divulguei. Me senti culpado.
A última vez que precisei usá-lo, foi para inserir aspas em um arquivo CVS de http://www.magentocommerce.com/.
Texto,Tradução

Mas quando o conteúdo tem ",", temos que colocar entre aspas:
"Texto","Tradução, certo?"

Para isso basta usa a seguinte expressão regular para encontrar as expressões sem aspas.

Busca por:
^([^"].*),(.*[\w\?\!\.\:\;\>\)\'])$
Substituir por:
"\1","\2"
Abraço!