PHPテスト関数preg_match

PHP関数preg_matchがソース文字列として100,000(10万)以上の音節からなる文字列を渡すと、誤った結果が返されます。 より正確には、この場合の結果は常に偽になります。



非常に簡単にチェックされます。

$max_n=100010;

$n=99900;

$tmp_str=str_repeat('b',$n);

$go=true;

while (($go)&&($n<=$max_n)) {

$n++;

$tmp_str.='b';

$str='a'.$tmp_str.'a';

$go=preg_match('/a.*?a/sim', $str);

if (!$go) {

echo 'error on length '.strlen($str);

die;

}

}

echo ' ok';







このスクリプトの結果はこのようなメッセージになります

error on length 100000







つまり、preg_matchは長さが10万文字の文字列をマスターしていませんでした。 長い行では、結果は同じになります。 関数が長さ100,000バイトの文字列でつまずく理由は完全にはわかりませんが。 どうやらこれは実装の機能です。



PHPバージョン5.2.6-1のチェック済み。



したがって、大きな文字列を処理する必要がある場合は、preg_match関数の使用を控えることをお勧めします。



上記のすべては、PHP関数preg_match_allにも当てはまります。



コメント l2kからの問題に対するUPDソリューション

ini_set(«pcre.backtrack_limit»,10000000);





この方法で、PCREバックリンクの制限を変更できます。

さらに、ディレクティブPHP_INI_ALLの可変性は、どこにでもインストールできることを意味します。



All Articles