2

正则表达式能找到一个模式吗?

{{foo.bar1.bar2.bar3}}

组中的位置

$1 = foo $2 = bar1 $3 = bar2 $4 = bar3 等等..

这就像一遍又一遍地重新做表达式,直到它无法获得匹配。

我正在处理的当前表达式是

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

这是来自正则表达式的链接。

http://regexr.com?3203h

--

好的,我想我没有很好地解释我在这里想要实现的目标。

假设我正在尝试替换所有

.barX{{foo . . . }}

我的预期结果应该是

$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

我不是 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 回答
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 回答
0

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

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

这将在第一个捕获组中捕获第一个命中,在第二个捕获组中捕获其余命中。据我所知,regexr.com 缺乏展示这一点的能力。试试Expresso,你就会明白我的意思。

于 2012-08-30T06:35:35.587 回答