1

こんにちは私はphpの繰り返し正規表現でいくつかの問題を抱えています。{{if(x=y)? {{ true do something || false do something else }} HTMLファイルのような文字列があり ます。ある種の基本的なテンプレートエンジンになります。使用する場合

$matches=array();
$content = "{{if(x=y)? true do something || false do something else }}";
preg_match_all('/\{\{if\((.*?)\)\?(.*?)\|\|(.*?)\}\}/is',$content,$matches);

期待どおりの結果が返されます。

Array(
 [0] => Array
    (
        [0] => {{if(x=y)?
            true do something 
               ||
            false do something else 
               }}
    )
 [1] => Array
    (
        [0] => x=y
    )
 [2] => Array
    (
        [0] => true do something 
    )
 [3] => Array
    (
        [0] => false do something else 
    )
)

しかし、パターンが次のような別のパターンとネストされている場合。

{{if(x=y)?
  {{if(y=z)?
     true do something 
   || 
     false do something else 
  }}
||
  {{if(x=a)?
    true do something 
  || 
   false do something else 
  }}
}} 

パターンの終わりとして最初の"}}"文字を取り、失敗します

Array
(
    [0] => Array
    (
        [0] => {{if(x=y)?
            {{if(y=z)?
          true do something 
            ||
          false do something else 
            }}
        )
    [1] => Array
    (
        [0] => x=y
    )
    [2] => Array
    (
        [0] => {{if(y=z)?
    true do something   
    )
    [3] => Array
    (
        [0] => 
    false do something else     
    )
)

繰り返し正規表現を作成したいので、trueまたはfalseの各部分で、一致したコンテンツが再び同じパターンを持っているかどうかを確認する必要があります。Ifの論理部分はすでに実行されています。結果をループできるように、正規表現がパーツと一致する必要があります。正規表現の知識があれば、これまでにできることはこれだけです。より説明的に編集 する正規表現がこのようなものを解析できる必要があります。

{{if()?{{if()?{{if()?...||...}}||{{if()?...||...}}}}||{{if()?{{if()?...||...}}||{{if()?...||...}}}}}}

しかし、私が使用した正規表現は、最初の{{iftofirst}}からしかキャッチできません。

{{if(){{if(){{if()...||...}}

これは正規表現に対して正しいです。しかし、正規表現を「テキスト全体を取得し、{{if()?と}}の間のブロックを最後まで見つけて、最後にない場合は他のブロックを無視する」または「最も外側の{{if ()?||}}ブロック。ありがとう

4

2 に答える 2

1

リンクを使用して問題を解決しました。スクリプトの作成者は、別のスタイルでそれを十分に単純にしました。私のサンプルでは、​​コードブロックを正規表現と照合してデータに置き換えようとしましたが、実際にはコードブロックをphpコードに置き換え、同じ構造の別のフォルダーにファイルを再作成し、ページが要求されるたびに、最初にファイルの存在と更新された時刻とスクリプトを実行します。かなり賢い。完璧な解決策や合理的な解決策ではないかもしれませんが、私の問題は解決します。とにかくありがとう

于 2013-01-02T13:47:56.130 に答える
1

ネストされたパターンは、どのような正規表現でも使用できません。これは正規表現の基本的な制限です。レクサーなど、より強力な形式のパーサーが必要です。

簡単に言えば、入力のすべての文字を手動で繰り返し、可能なキーワードを解析し、開いているブロックの数を記憶しておく必要があります。

既存のテンプレートシステムをニーズに合わせて調整することで、おそらくはるかに良い結果が得られます。

于 2012-12-18T22:55:47.970 に答える