4

PHPでは、次の文字列があります。

 $text = "test 1
          {blabla:database{test}}
          {blabla:testing}
          {option:first{A}.Value}{blabla}{option:second{B}.Value}
          {option:third{C}.Value}{option:fourth{D}}
          {option:fifth}
          test 2
         ";

この文字列からすべての{ option...}を取得する必要があります(この文字列では合計5つ)。ネストされた角かっこが複数あるものとないものがあります。同じ線上にあるものとそうでないものがあります。

私はすでにこの正規表現を見つけました:

(\{(?>[^{}]+|(?1))*\})

したがって、以下は正常に機能します。

preg_match_all('/(\{(?>[^{}]+|(?1))*\})/imsx', $text, $matches);

中括弧内にないテキストは除外されますが、一致にはblabla-itemsも含まれます。これは必要ありません。

optionこの正規表現を変更して-itemsのみを含める方法はありますか?

4

4 に答える 4

1

この問題は適切なパーサーにはるかに適していますが、本当に必要な場合は正規表現を使用して行うことができます。

これは、他のオプション内にオプションを埋め込まない限り機能するはずです。

preg_match_all(
    '/{option:((?:(?!{option:).)*)}/',
    $text,
    $matches,
    PREG_SET_ORDER
);

簡単な説明。

{option:               // literal "{option:"
  (                    // begin capturing group
    (?:                // don't capture the next bit
      (?!{option:).    // everything NOT literal "{option:"
    )*                 // zero or more times
  )                    // end capture group
}                      // literal closing brace

var_dumpサンプル入力を含むed出力は次のようになります。

array(5) {
  [0]=>
  array(2) {
    [0]=>
    string(23) "{option:first{A}.Value}"
    [1]=>
    string(14) "first{A}.Value"
  }
  [1]=>
  array(2) {
    [0]=>
    string(24) "{option:second{B}.Value}"
    [1]=>
    string(15) "second{B}.Value"
  }
  [2]=>
  array(2) {
    [0]=>
    string(23) "{option:third{C}.Value}"
    [1]=>
    string(14) "third{C}.Value"
  }
  [3]=>
  array(2) {
    [0]=>
    string(18) "{option:fourth{D}}"
    [1]=>
    string(9) "fourth{D}"
  }
  [4]=>
  array(2) {
    [0]=>
    string(14) "{option:fifth}"
    [1]=>
    string(5) "fifth"
  }
}
于 2013-02-05T19:50:45.413 に答える
0

最初の式を変更して、空白文字以外の文字 (\S*) が追加された文字列 '(option:)' を検索し、中かっこ '{}' で囲みました。

\{(option:)\S*\}

入力テキストを指定すると、正規表現で次のエントリが一致します。

テスト1

{blabla:データベース{テスト}}

{blabla:testing}

{option:first{A}.Value} {option:second{B}.Value}

{option:second{C}.Value}

{option:4番目{D}}

{オプション:5番目}

テスト 2

于 2013-02-05T18:53:21.430 に答える
0

この正規表現を試してください - .NET 正規表現を使用してテストされています。PHP でも動作する可能性があります。

\{option:.*?{\w}.*?}

注意してください - 内側にブラケットが 1 組しかなく、そのペア内に英数字が 1 文字しかないと仮定しています。

于 2013-02-05T18:54:14.737 に答える
0

同じレベルに複数のブラケットのペアがない場合、これは機能するはずです

/(\{option:(([^{]*(\{(?>[^{}]+|(?4))*\})[^}]*)|([^{}]+))\})/imsx
于 2013-02-05T19:40:47.573 に答える