非常に簡単にチェックされます。
$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の可変性は、どこにでもインストールできることを意味します。