2012-08-30 82 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