sábado, 16 de janeiro de 2010

Bug no Apache/PHP e Expressões Regulares

Encontrei outro bug, mas descobri que já postaram no PHP Bugs: http://bugs.php.net/bug.php?id=47689
O problema que esse bug é um bug do Apache, conforme os comentários no site a correção é aumentar o Stack Size do Apache, editando o httpd.exe...
Como eu estou com preguiça de fazer isso, corrigi meu código de outro jeito...

Estou tentando fazer uma expressão regular pra capturar partes de um html gigante com vários ...
Segue um exemplo do código
$b= "" . str_repeat("a", 686)."";
$a = '/((.|\r|\n|\t)*?)<\/td>/i';
preg_match_all($a,$b,$c);
print_r($c);
O problema é que se o Match tiver mais de 685 caracteres o Apache trava, sem mensagem de erro, apenas falha na conexão...
Ou seja se tivermos 685 a's o script roda normal, mas 686 a's ele trava...
Rodando em linha de comando não tem o problema...
A solução foi simples, no lugar da expressão regular usei essa: /(.*?)<\/td>/si
Foi simples assim, o modificador s faz com que o ponto . também capture newline \n, é que no exemplo não tem \n, mas no texto tinha...
Segue o site onde aprendi sobre o *? e s: Extreme regex foo: what you need to know to become a regular expression pro
Isso não corrige o problema do Apache, mas se o seu caso for igual ao meu, vale a dica!!!

Nenhum comentário: