2016-05-26 6 views
2

を引き起こし[if condition1] aa [if condition2] bb [endif] [endif]。私は改行をドットで扱いました(複数行で作業したいので)、xを読むのが簡単でしたが(xを削除しても問題は解決しません)比較的単純なPreg_match_allは、私は、パターンをpreg_match_all機能を持っている502不正なゲートウェイ

入力データの大部分は正常に動作しますが、特定の入力では、ログにエラーや例外がなく、nginxサーバーで502ゲートウェイのエラーが発生します。私はnginx + php-fpm(5.6.15-1 + deb.sury.org〜trusty + 1)を使用していますが、php7でも同じことが起こります。

ここでは502ゲートウェイエラーが発生しています。PHPコードを簡単に確認できます。非常に簡単で、変数と正規表現です。

http://pastebin.com/G54Xa0as

してください、あなたはコンテンツ1コピーしたことを確認してください:すべてのスペースで、1を、タブなど

非常にスタンジェの事はあなたがほぼすべての単一の行を削除したり、1を削除することができるということですインデント(任意の場所にスペースを入れてください)を使って作業してください。

ここに何が間違っているのか分かりませんが、この1つのファイルを作成して問題を示すことができましたが、修正方法はありません。

+0

私はeval.inで再現できません:https://eval.in/577522 – jeroen

+0

@jeroen right、驚くべきことに、phpを使ってうまく動作し、 'php test.php'を使って動作していて、期待通りに動作しています。この問題は、ファイルがphp-fpm(nginx/1.8.0)でnginx経由で開かれたときにのみ発生します。 – atay

+1

['\((if))* +)\]((?>(?! \ {(?R)} *)\ [endif \] '](https://regex101.com/r/xA3iC8/1)または[' \ [(もし、\ b)[^ [] *)*)()ならば、\ s +([^ \]] |(?R))*)\ [endif \] '](https://regex101.com/r/xA3iC8/2)。 –

答えて

2

あなたの正規表現には、ドットパターンを「調整」するネガティブな先読みが含まれています。しかし、終了区切り文字を追加することに失敗したため、「重い」状態になりました。

\[(if)\s+([^\]]*+)\]((?>(?!\[(?:end)?if\b).|(?R))*)\[endif\] 
          ^^^^^^^^ 

は、あなたも

\[(if)\s+([^\]]*+)\]((?>[^[]++(?:\[(?!(?:end)?if\b)[^[]*)*|(?R))*)\[endif\] 

見るように鍛え貪欲トークンをアンロールすることができ、demo

を参照するか:

私は先読みチェックに終了デリミタ([endif])を追加することをお勧めthe regex demo(しかし、[[if...]の後に続く場合、それは動作しません)。あなたの正規表現は(if)の後にスペースがあり、/x修飾子を使用しているので、それは文字通りスペースとして考慮されていませんが、無視されます。また

ノート。だから私はそれを \s+に変更しました。

関連する問題