在正则表达式中循环

时间:2012-08-30 06:28:07

标签: php regex pattern-matching iteration

正则表达式可以为此找到一个模式吗?

  

{{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 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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}}"

答案 2 :(得分: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

它应该允许您使用简单的正则表达式详尽地搜索给定的字符串。我认为你也应该能够通过删除大括号和分割字符串来获得你想要的东西。

答案 3 :(得分:0)

我不知道PHP中的正确语法,用于取出结果,但你可以这样做:

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

这将捕获第一个捕获组中的第一个命中,其余捕获在第二个捕获组中。尽管如此,regexr.com缺乏展示能力。试试Expresso,你会明白我的意思。