PHP の正規表現で preg_match がおかしい時は pcre.backtrack_limit の上限を増やしてみる

カテゴリ: PHP

記事投稿日: 2017年4月17日



何が起きたか

PHPの正規表現のパターンマッチ数には、上限があり、ローカルの nginx は 1,000,000 だが、Heroku はそれより少ない(おそらく 100,000) のため、例外が発生した

pcre.backtrack_limit とは

* PHP 5.2.0 から、通常は、 pcre.backtrack_limit を超えるマッチができない
* pcre.backtrack_limit は、PCRE(Perl Compatible Regular Expression:正規表現エンジン)のバックトラックリミット
* デフォルトの制限値は 1,000,000( PHP < 5.3.7 ではデフォルトが 100,000)。

確認方法

* phpinfo() で pcre.backtrack_limit を検索する
* echo ini_get(‘pcre.backtrack_limit’); で出力する

上限を超える場合

* preg_match : マッチしない時の「0」が返る
* preg_replace: NULL が返る

上限を増やすには

* php.ini を直接編集する場合 → 「memory_limit」の下に「pcre.backtrack_limit = 200000」を追加
* ini_set を使う場合 → ini_set(‘pcre.backtrack_limit’, 1000000);

参考文献

【php】正規表現ってそんなに負荷が高いの?(その3)
https://www.softel.co.jp/blogs/tech/archives/908

【PHP】preg_match関数が動かない原因は「pcre.backtrack_limit」
http://ysklog.net/php/1340.html

[セキュリティ]マッチするはずの正規表現がマッチしない現象
http://d.hatena.ne.jp/teracc/touch/20100410/1270885661 ※リンク切れ

正規表現のパフォーマンスの話をされても全くピンと来なかった僕は、backtrackに出会いました。
http://qiita.com/mochizukikotaro/items/d36e61e56220da5f95d1

所感

正規表現は便利ですが、できるだけ「長く」「詳細に」書くことが大切なんだなと思いました。
サーバを移管して、プログラムが動かなくなる時のチェック事項としても知見を得ることができました。








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA




トップに戻る