2013-07-29 14 views
7

場合によっては、PHPのpreg_matchに3276文字の制限があるようです。PHP preg_match length 3276 limit

すなわち

^(.|\s){0,3276}$作品が、^(.|\s){0,3277}$ません。

/^(.){0,3277}$/のように、常に適用されないようです。

PHPのマニュアルやバグトラッカーのどこにも記載されていません。 3276という数字はちょっと奇妙な境界のようですが、私が考えることができるのは、符号付き16ビット整数の限界である32767の約1/10だと思います。

preg_last_error() 0を返します。

私はhttp://www.phpliveregex.com/上の問題だけでなく、私のローカルシステムとWebサーバを再現しました。

編集:警告:preg_match():コンパイルに失敗しました:正規表現がコードからオフセット16で大きすぎるため、PHP preg_match_all limitと同じ問題があるようです。

しかし、正規表現そのものはそれほど大きくありません...繰り返しすぎているグループを繰り返すと、PHPは何らかの拡張をしますか?

+0

preg_matchは多くの要素を持つ配列を返すので、大きな配列を使用できるようにする必要があります。それが変わるならば。 –

+1

'preg_last_error()'をチェックしましたか? –

+0

はあなたのエラー報告ですか?あまりにも多くのメモリを使用すると、何らかのエラーが発生するはずです – x4rf41

答えて

0

はPerl互換の正規表現を処理するために^(.|\s){0,3276}(.|\s){0,1}$

1

を使用してみてください、PHPはただの仕事の世話をthird-party libraryがバンドルされています。

"*" 数量詞は{1、} に{0、}、 "+" 数量詞に相当し、そして:あなたが記述動作は、実際にdocumentedあります "?" {0,1}に限定されます。 nおよびmは、 perlが構築されるときに定義される予め設定された限度よりも小さい負の整数値に に制限されます。これは通常、最も一般的なプラットフォームでは32766です。

したがって、常に厳しい制限があります。なぜあなたのテストは、PHPの制限が典型的なものよりも10倍小さいことを示唆していますか?それについてのアイデアはありません:)

+0

+1これはおそらく問題であるためです。この問題に見られる小さな制限は、 '.'と' \ s'を実質的に大量のバックトラックを保証する方法で組み合わせる場合にのみ適用されます。制限がバックトラッキング(合理的な推測です)の影響を受けていると推測すれば、制限がこのようなレベルに達した場合は驚きではありません。 – Spudley