2012-08-30 42 views
2

可以正则表达式能够找到一个啪答声呢?循环内的正则表达式

{{foo.bar1.bar2.bar3}}

其中在基团将是

$ 1 = FOO $ 2 = BAR1 $ 3 = BAR2 $ 4 = BAR3等..

它会像重复做表达一遍又一遍,直到它无法获得匹配。

当前表达我的工作是

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

下面是从regexr的链接。

http://regexr.com?3203h

-

好,我想我没有解释清楚我想在这里实现。

比方说,我想全部更换

.barX一个{{FOO内。 。 。 }}

我预期的结果应该是

$foo->bar1->bar2->bar3 
+0

为什么don'y你只是用'#(\ w +)#'模式搭上话,没有'.'和'{ }'? –

+3

正则表达式真的是最好的方法吗?你为什么不去掉两端的支架并使用'explode'? – Barmar

回答

0

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

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

那倒在第一个捕获小组中捕获第一个命中,在第二个捕获小组捕获其余部分。 regexr.com缺乏显示的能力,只要我能看到。试试Expresso,你会明白我的意思。

+0

不会。它会捕获“$ 1”中的第一个命中和“$ 2”中的最后一个命中。中间的一切都会被最后一次重复所覆盖。 –

+0

编辑我的回复,你是正确的,变量$ 2将被覆盖,但结果仍然会保持所有匹配。这在.NET中很简单,你只需要这样匹配对象(_System.Text.RegularExpressions.Match_):'for(int i = 0; i

+0

@TimPietzcker(忘记在我之前的评论中加入对你的引用) –

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}}" 
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

这应该工作,假设没有括号比赛中不允许:

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]; 
+0

你是先生,是一位正统的LoL神。尽管它没有使用preg_replace。因为我想要替换的只是'.barX'。虐待编辑问题的更多信息。 – kapitanluffy

+0

@kapitanluffy:不知道我明白。对这个问题的编辑表明你*不想*替换文本,而只是将它们分隔符(将{{foo.bar1.bar2.bar3}}'变成'$ foo-> bar1-> bar2- > bar3')。那是对的吗?因为这是一个完全不同的问题。 –

+0

抱歉误会。它可能是这样的$ foo [bar1] [bar2] [bar3] – kapitanluffy