preg_replace_callback()で、60KB超えくらいのテキストに置換をかけたら、エラーが発生せずに、結果が空になってしまった。 短いテキストなら問題ない。 preg_last_error()で調べてみたら6が返ってきていた。 たぶんPREG_JIT_STACKLIMIT_ERROR(参考1)だと思う。

preg_replace_callback()は、置換とコールバックもあるから、エラーになりやすいかもしれないので、該当部分を取り出してstr_replace()で対応してみようと、preg_match_all()してみたが、preg_match_all()直後にPREG_JIT_STACKLIMIT_ERRORでダメだった。

シンプルなテストコードを確認してみたら、単純に入力のテキストの長さだけが影響するのではなくてパターンや入力テキストの複雑さも関連するみたいだ。そして、preg_match_all()ではなくて、preg_match()ならPREG_JIT_STACKLIMIT_ERRORは発生しない(する可能性が低い)ようだ。

しかたないので、preg_match()で見つけた部分をstr_replace()で書き換えて、preg_match()がマッチしなくなるまで繰り返すことにする。

preg_match()でもPREG_JIT_STACKLIMIT_ERRORが発生した。 パターンに否定先読みを使っているがダメなのだと思う。

その後、いろいろ試してみたがダメだ、今回は正規表現は使わない。

参考

  1. http://php.net/manual/ja/pcre.constants.php#118538