1

2つの中括弧またはSmartyタグの間にコンテンツを取得しようとしています。を無視して、smarty関数のみの変数を取得したいif

文字列タグのサンプルは次のとおりです。

{{$variable|lower}}[一致する必要があります]

{{$variable|escape:javascript}}[一致する必要があります]

{{$variable|str_replace:"search":"replace"}}[一致する必要があります]

{{if $test eq "test"}}[一致してはいけません]

{{section name=foo start=10 loop=20 step=2}}[一致してはいけません]

私がこれをするなら

preg_match_all('/{{\$?(\w+?[\W\w]*?)}}/',$str,$matches)

すべてを角かっこで囲みます。

preg_match_all('/{{\$?(\w+?\W*?\w*?)}}/',$str,$matches);

これは「変数|エスケープ」のみを取得します。

正しい正規表現を手伝ってください。

ありがとう

4

2 に答える 2

0

この正規表現を使用する\{\{.*?\|.*.+?\}\}

于 2012-08-07T14:31:40.990 に答える
0

私は間違っている可能性がありますが、単純ではありません:

preg_match_all('/\{\{(\$[^|]+)\|[^}]+\}\}/',$str,$matches);

トリックを実行します。ここで$matches[1]変数を保持します。ファイルにキャリッジリターン(windows'\ r \ n)が含まれている場合は'/\{\{(\$[^|]+)\|[^}]+\}\}/s's修飾子を付けて試してください

次のような一致を含めるには:{{$var}}

//{{$var|foo}} {{$varbar}} bar  as test string
preg_match_all('/\{\{(\$[^|}]+)(\|[^}]+|)\}\}/s',$str,$matches);
//shorter still:
preg_match_all('/\{\{(\$[^|}]+)\|?[^}]*\}\}/s',$str,$matches);

戻り値:

array (
  0 => 
  array (
    0 => '{{$var|foo}}',
    1 => '{{$varbar}}',
  ),
  1 => 
  array (
    0 => '$var',
    1 => '$varbar',
  ),
  2 => //not in the array when using the second pattern
  array (
    0 => '|foo',
    1 => '',
  ),
)
于 2012-08-07T14:39:05.117 に答える