超長い正規表現をPHPのpreg_match関数に食わせたところエラーになった。
2022/9/30現在、公式ドキュメントにはこの振る舞いは記載されていないので調べたことを残しておく。
https://www.php.net/preg_match
エラーメッセージ
PHP Warning: preg_match(): Compilation failed: regular expression is too large at offset 32765 in php shell code on line 2
正規表現長すぎと怒られていることが読み取れる。
検証コード
# php -a Interactive shell php > echo PHP_VERSION; 8.1.9 php > $length = 32000; php > while (true) { php { if (preg_match('/' . str_repeat('a', $length) . '/', 'x') === false) { php { echo "max:" . ($length - 1); php { break; php { } php { $length++; php { } PHP Warning: preg_match(): Compilation failed: regular expression is too large at offset 32765 in php shell code on line 2 max:32764
※ 初期 $length
を32,000としているのは、事前の調査で32,000ではpassして33,000ではエラーになることが分かっていたため
まとめ
preg_match関数の第一引数 ($pattern) として渡せる正規表現の長さは最大32,764文字。
それを超えると Compilation failed
Warningが発生し、実行結果はfalseとなる。