2

正規表現はこれにパターンを見つけることができますか?

{{foo.bar1.bar2.bar3}}

グループのどこにいるでしょう

$1 = foo $2 = bar1 $3 = bar2 $4 = bar3 など..

一致が得られなくなるまで式を何度もやり直すようなものです。

私が取り組んでいる現在の式は

(?:\{{2})([\w]+).([\w]+)(?:\}{2})

これはregexrからのリンクです。

http://regexr.com?3203h

--

ここで達成しようとしていることをうまく説明できなかったと思います。

すべてを置き換えようとしているとしましょう

{{foo内の.barX 。. . }}

私の期待される結果は

$foo->bar1->bar2->bar3
4

4 に答える 4

3

一致内で中括弧が許可されていないと仮定すると、これは機能するはずです。

preg_match_all(
    '%(?<=     # Assert that the previous character(s) are either
     \{\{      # {{
    |          # or
     \.        # .
    )          # End of lookbehind
    [^{}.]*    # Match any number of characters besides braces/dots.
    (?=        # Assert that the following regex can be matched here:
     (?:       # Try to match
      \.       #  a dot, followed by
      [^{}]*   #  any number of characters except braces
     )?        # optionally
     \}\}      # Match }}
    )          # End of lookahead%x', 
    $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
于 2012-08-30T08:03:38.627 に答える
1

私はそうは思いませんが、次のようにピリオドで文字列を分割するのは比較的簡単です。

$str = "{{foo.bar1.bar2.bar3}}";
$str = str_replace(array("{","}"), "", $str);
$values = explode(".", $str);

print_r($values);  // Yields an array with values foo, bar1, bar2, and bar3

編集:質問の編集に応じbarXて、次のようにして文字列内のすべてを置き換えることができます:

$str = "{{foo.bar1.bar2.bar3}}";
$newStr = preg_replace("#bar\d#, "hi", $str);

echo $newStr; // outputs "{{foo.hi.hi.hi}}"
于 2012-08-30T06:40:08.413 に答える
1

私は PHP の専門家ではありませんが、次のコードを作成することができました。

preg_match_all("([a-z0-9]+)",
"{{foo.bar1.bar2.bar3}}",
$out, PREG_PATTERN_ORDER);

foreach($out[0] as $val)
{
echo($val);
echo("<br>");
}

上記のコードは以下を出力します。

foo 
bar1
bar2
bar3

単純な正規表現を使用して、特定の文字列を徹底的に検索できるようにする必要があります。中括弧を削除して文字列を分割することで、必要なものを取得できるはずだと思います。

于 2012-08-30T06:42:27.470 に答える
0

結果を引き出すためのPHPの正しい構文はわかりませんが、次のことができます。

\{{2}(\w+)(?:\.(\w+))*\}{2}

これは、最初のキャプチャ グループで最初のヒットをキャプチャし、2 番目のキャプチャ グループで残りをキャプチャします。私が見る限り、regexr.com にはそれを示す能力がありません。Expressoを試してみると、私の言いたいことがわかるでしょう。

于 2012-08-30T06:35:35.587 に答える