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!

Nenhum comentário: