2017-04-09 5 views
2

与えられた文字列$str = 'aa {{asd}} bla {{{888 999}} {555} 777 uiii {{-i {{qw{er}}';最も近い開閉ダブル中括弧の間のすべてのオカレンスを取得が必要に最も近い二重括弧

間のすべてのオカレンスを取得します。

望ましい結果:

  • ASD
  • QW {ER

しようとした場合:preg_match_all('#\{\{(.*?)\}\}#', $str, $matches);

電流出力:

  • ASD
  • {888 999
  • -iは、{{{QW ER

は、しかし、これらの発生は、最も近い二重中括弧の間にはありません。

質問:これはどのようなパターンですか?

+0

入力が含まれている場合に予想される出力は何だろう'{{{a} b}}'のようなもの? '{a} b'または' a} b'ですか? –

+0

@Rawing - この場合、期待される出力: 'a} b' –

答えて

3

あなたはこのパターンを使用することができます

\{\{(?!\{)((?:(?!\{\{).)*?)\}\} 

ここにトリックは、ネストされた括弧にマッチするのを避けること(?!\{\{)のような負の先読みを使用することですが。


\{\{  # match {{ 
(?!\{)  # assert the next character isn't another { 
(
    (?: # as few times as necessary... 
     (?!\{\{). # match the next character as long as there is no {{ 
    )*? 
) 
\}\}  # match }} 
1

Regex demo

正規表現:(?<=\{{2})(?!\{)[\s\w\{]+(?=\}\})

(?=\}\})

0の後ろに中括弧を含めるべき先行

(?<=\{{2})重中括弧を含めるべきです

(?!\{) 2つの一致

PHPコードの後ろに中括弧を一の中括弧を含めることはできません。

$str = 'aa {{asd}} bla {{{888 999}} {555} 777 uiii {{-i {{qw{er}}'; 
preg_match_all("/(?<=\{{2})(?!\{)[\s\w\{]+(?=\}\})/",$str,$matches); 
print_r($matches); 

が出力:

Array 
(
    [0] => Array 
     (
      [0] => asd 
      [1] => 888 999 
      [2] => qw{er 
     ) 

)