2010-09 << 2010-10 >> 2010-11

2010-10-22 (金)

*PHPのpreg_*系の正規表現

以下のコードをPHPで実行するととても時間がかかります.さらに,str_repeatの数を2000くらいにすると,PREG_RECURSION_LIMIT_ERRORになりnullが返ってきてしまいます(この時は一瞬).(PHP5.2.13と5.2.9で確認)

$str = str_repeat('abcdefghijklmnopqrstuvwxy',1000);
print strlen($str);

$str = preg_replace('/[a-y]+(z+)/','', $str);
print "preg_end\n";
print $str;

PHPのバグなのか,PCREの仕様なのか….もしかして,PCREってあんまり賢くないのかなぁ.よっぽど愚直な実装でない限り,この正規表現は線形時間で済むはずだけど….

ちなみに,Perlで同様のことをしても一瞬で正しい結果が得られます(あたりまえですが).

2010-09 << 2010-10 >> 2010-11