Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
AVISO
Este é um tópico GRANDE e EXAUSTIVO.Se você tem nervos sensíveis e/ou não quer acabar como Charles Chaplin em "Tempos Modernos" (nussa) nem continue a ler.
Esse debate tempor objetivo desenvolver ou aprimorar uma solução eficaz contra um problema no mínimo diferente.
Agradeço por antecedência.
===========================
Essa eu quero ver.
Estava eu testando meu domínio sobre Expressões Regulares com o Guia de Consulta do Aurélio e me perguntei:
"Como verificar se uma string é uma Expressão Regular".
Acredito que muitos já pensaram nisso, mas nunca vi jeito para descobrir.
Fuçando no Google CodeSearch encontrei duas possíveis soluções:
Possível Solução #1
function isRegex($var, $regex) {
return filter_var($var, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => $regex)));
}
Passei a mesma variável para os dois parâmetros e ora funcionava, ora não.
Ex:
$var = '/^(.*?)$/';
Isso retornava uma string (com var_dump)
$var = '/^(.*?)foo$/';
Isso retornava FALSE.
Resultado: NEGATIVO
Possível Solução #2
function isRegex2($value, $pattern = NULL) {
return (bool) preg_match($pattern, $value);
}
Pelo que consegui entender, essa faz/fazia parte do Zend_Filter.
Não funcionou nas mesmas condições que a primeira possível solução.
Porém, o parâmetro $patterné nulo, logo poderia tentar ignorá-lo e, obviamente, preg_match() gerou um erro pois não havia padrão a ser usado.
Resultado: NEGATIVO
Possível Solução #3
function isRegex3($regexp){
$er = '/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/';
return (bool) preg_match($er,$regexp);
}
Essa eu encontrei por acaso numa palestra em vídeo do Douglas Crockford.
Tive o trabalho de copiar caractere por caractere e testar dentro do preg_match() montado acima.
No próprio vídeo, ele menciona que essa ER está bizarra e, justamente por isso, gerou um erro:
Warning: preg_match() [function.preg-match]: Unknown modifier ']'(...)
Alguém tentou corrigí-la alterando para isso:
$er = '/\/(\[^\x00-\x1f]|[(\[^\x00-\x1f]|[^\x00-\x1f\\/])]|[^\x00-\x1f\\/[])+\/[gim]/';
Mas parece que não o fez direito pois gerou outro erro:
Warning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 65
Então, eu, morrendo de medo desse bicho cabeludo, tentei re-arrumar:
$er = '/\/(\[^\x00-\x1f]|\[(\[^\x00-\x1f]|[^\x00-\x1f\\/])\]|[^\x00-\x1f\\/\[])+\/[gim]/';
E para minha supresa funcionou :o
Fazendo como que:
$var = '/^(.*?)foo$/';
Casasse como sendo uma ER válida.
Porém, como nem tudo são flores, fui depurar manualmente e tirei o )foo e continuou casando e retornando TRUE.
Fui além e mudei a ER alvo da verificação para:
$var = '(.*?';
E só assim retornou FALSE. Ou seja, só barrou porque tirei as barras delimitadoras e as âncoras de início e de fim.
Felizmente esse casamento incorreto só acontece quando os delimitadores são barras. Tanto é verdade que testei com arrobas e deu certo, continuou retornando FALSE.
Resultado: QUASE PERFEITO
Antes de ver essas solução de um profissional, encontrei outra, porém em Perl que não entendo lhufas:
Possível solução #4
sub is_valid_re {
eval { qr/$_[0]/ };
return $@ ? 'NO' : 'YES';
}Tentei reproduzir em PHP com a ajuda de uma tabela de tradução entre as linguagens criada por Robert Kline
Mas não adiantou nada e acabei desisitindo.
Então, depois de um super exaustivo tópico, a pergunta:
E então? É possível validar uma string verificando se ela é uma ER?
A solução indireta do Douglas Crockford me pareceu mais sensata e funcional, porém tem esse contratempo que pode ocasionar imprevistos e como não tenho certeza se tem a ver com a "portabilização" entre as linguagens (visto que essa ER originalmente é para JavaScript),não pude resolver ainda.
Bom, é isso se quiserem (e puderem), comentem para desenvolvermos juntos uma solução para isso.
O mais trabalhoso eu fiz: encontrar alternativas e propor um "debate". Agora vamos aperfiçoá-los.
Editado por Bruno Augusto
Motivo: Remover BBCode [perl[/perl] que não existe.
Carregando comentários...