2012-05-26 63 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