2012-05-26 102 views
0

如何將{@if condtwo}的內容轉換爲匹配的{!if}獲取匹配模板標籤之間的內容

{@if condtwo} 
    {@if condone} 
     show this if condone is true 
    {!if} 
other contents 
{!if} <- matching {!if} 

我試過使用preg_match_all。這裏是我的正則表達式:

/([\s]*?{@IF(.*?)}[\s]*?)(.+?)([\s]*?{!$IF}[\s]*?)/si 

的問題是,它只是變得均來自{@if condtwo}內容下一{!if}

{@if condtwo} 
    {@if condone} 
     this is a table 
    {!if} 
+1

請不要試圖解析那些使用正則表達式。雖然PHP支持遞歸匹配(至少,我認爲它) - 你真的不應該這樣做。這很混亂。 – Ryan

回答

1

好吧,我知道我說沒有使用正則表達式,但。 .. 我撒了謊。這可以做到,也可能是最好的辦法。

/{@if(.+?)}(((?>[^{}]+)|(?R))*){!if}/si 

Here's a working demo.你可能也想看看the documentation for recursive regular expressions

+0

好吧,你的意思是我現在可以使用它?我正要重新編寫我的代碼 – kapitanluffy

+0

@kapitanluffy:是的,你現在可以使用它:)它實際上並不像我原先想象的那麼混亂。抱歉。 – Ryan

+0

你介意解釋一下它是如何工作的嗎?我理解它的大部分,但不是?R和?> [部分 – kapitanluffy