2012-06-13 40 views
4

我有一個字符串,它由幾個句子組成,這些句子位於我想刪除的花括號中。這並不難(正如我現在所知道的那樣),但真正的麻煩在於它是多層次的,我想要剝離的是頂級括號,並將所有內容保留完好。它看起來是這樣的:PHP,正則表達式和多級大括號

{Super duper {extra} text.} {Which I'm really {starting to} hate!} {But I {won't give up} so {easy}!} {Especially when someone is {gonna help me}.} 

我想創建一個數組,將由這四個條目:

Super duper {extra} text. 
Which I'm really {starting to} hate! 
But I {won't give up} so {easy}! 
Especially when someone is {gonna help me}. 

我已經嘗試了兩種方式,一種是使preg_split這並沒有做太多好:

$key = preg_split('/([!?.]{1,3}\} \{)/',$key, -1, PREG_SPLIT_DELIM_CAPTURE); 
$sentences = array(); 

for ($i=0, $n=count($key)-1; $i<$n; $i+=2) { 
$sentences[] = $key[$i].$key[$i+1]."<br><br>"; 
} 

另外一個是使用preg_match_all這是相當不錯,直到我意識到我必須多層次的括號:

$matches = array(); 
$key = preg_match_all('/\{[^}]+\}/', $key, $matches); 
$key = $matches[0]; 

在此先感謝! :)

+0

是你的大括號保證要進行平衡? – ghoti

+0

@ghoti是的,他們保證是平衡的。 – moskalak

+0

@Vulcan我已經添加了關於我試過的原始帖子的信息。 – moskalak

回答

5

可以使用遞歸表達式所示:

/{((?:[^{}]++|(?R))*+)}/ 

的期望的結果將是第一個捕獲組英寸

用法,是這樣的:

preg_match_all('/{((?:[^{}]++|(?R))*+)}/', $str, $matches); 
$result = $matches[1]; 
+0

編輯:它的作品,我明白了,非常感謝,先生!現在我只需要明白這個正則表達式究竟做了什麼。 :) – moskalak

+0

@moskalak,'$ matches [1]'中的元素。同樣歡迎來到SO,這裏最好的表達方式就是投票。 ;-) – Qtax

+0

所以我做到了。 :) – moskalak

4
$x="foo {bar {baz}} whee"; 
$re="/(^[^{]*){(.*)}([^}]*)$/"; 
print preg_replace($re, "\\1\\2\\3", $x) . "\n";' 

回報:

foo bar {baz} whee 
+0

謝謝你的提議。這會很棒,但它會返回一個除去頂級括號的字符串,而我真的需要創建一個數組,其中在頂層括起來的每個字符串都是另一個條目。 – moskalak