2017-10-05 71 views
0

我有一個字符串,它看起來像這樣:PHP搭配最外面套括號

$sample = <<<EOD 
lots of gibberish 
before what I want{{Template 
| x = 1 
| y = 2|z= 3}}more gibberish 
here too. {{Other|test}} 
EOD; 

我想擺脫的廢話,只是得到:

$sample = <<<EOD 
{{Template 
| x = 1 
| y = 2|z= 3}} 
EOD; 

我會通常尋找「{{模板」,並結束「}」,但我的問題是,它可能看起來像這樣有時會:

$sample2 = <<<EOD 
lots of gibberish 
before what I want{{Template 
| x = 1 
| y = {{Convert|1|2}}|z= {{Convert|3|4}}}}more gibberish 
here too. {{Other|test}} 
EOD; 

在這種情況下,它會打開並關閉一些curley括號,但我希望它與此匹配:

$sample2 = <<<EOD 
{{Template 
| x = 1 
| y = {{Convert|1|2}}|z= {{Convert|3|4}}}} 
EOD; 

我該怎麼做?

回答

0
\{(.*)\}/s 

這應該匹配最外面的括號,包括中間的換行符。

(\{\{Template(.*)\}\})\w+/s 

這將匹配{{Template Start with a}}後跟一些亂碼。在 「模板」 部分將被存儲在$ 1中

+0

會不說,還包括了「{{其他|測試}}「在$ sample? – GFL

+0

對不起,我匆匆了一下。我會解決它。 – LordNeo

1
\{\{Template[^\{]*(?:\{\{[^\}]*\}\}[^\{]*)*?[^\{]*\}\} 

觀看演示here


解釋

\{\{Template    //Starts with {{Template 
[^\{]*      //Any chars except { 
(?:\{\{[^\}]*\}\}[^\{]*)*? //Any inner groups+trailing chars conditional 
[^\}]*      //Any chars except { 
\}\}      //Ends with }} 
+0

@GFL爲您做了這項工作嗎? – kaza