モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

【 PHP 】 preg_match関数に渡せる正規表現の長さには上限がある

超長い正規表現を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となる。