2013-04-07 111 views
0

我正在使用模板系统。在这个模板系统中,我使用下面显示的if-else条件的结构;PHP嵌套如果条件

<if condition="'$condition' != 1"> 
    <div>true source</div> 
</if> 

比我用下面的模式分离表达式;

$pattern_case = '<if condition="(.*?)">(.*?)</if>'; 
preg_match("#$pattern_case#si",$string,$case) 

但有些情况下if-else进程可以在另一个内使用(嵌套的? - recusirve?)例如;

<if condition="'$condition1' != 1"> 
    <div>condition 1 text</div> 
    <if condition="'$condition2' == 2 "> 
     <div>condition 2 text</div> 
    </if> 
    condition 1 text more 
</if> 

在这种情况下,模式提供了以下结果。

<if condition="'$condition1' != 1"> 
    <div>condition 1 text</div> 
    <if condition="'$condition2' == 2 "> 
     <div>condition 2 text</div> 
    </if> 

(所以无此项)

condition 1 text more 
</if> 

不使用DOM文档如何解决与正则表达式这个问题?

回答

1

你不能。通过设计,正则表达式不能处理递归。

欲了解更多信息,你可能想在这里阅读第一个答案:Can regular expressions be used to match nested patterns?

是的,我知道,有些特殊的“正则表达式”不要允许递归。但是,在大多数情况下,这意味着你正在做一些可怕的事情。

0

您可以。 “按照设计,正则表达式不能处理递归。”是正确的,但是PCRE提供比严格正则表达式语言更多的功能。这就是为什么术语“正则表达式”在许多语言中不正确地指代“正则表达式”的原因。

的方式做到这一点:

$subject = <<<'LOD' 
<if condition="'$condition1' != 1"> 
<div>condition 1 text</div> 
<if condition="'$condition2' == 2 "> 
<div>condition 2 text</div> 
</if> 
condition 1 text more 
</if> 
LOD; 
$pattern = '~<if condition="(?<condition>[^"]+)">(?<content>(?:.*?(?R)?)+?)</if>~s'; 
preg_match_all($pattern, $subject, $matches); 
print_r($matches); // see your html source 

此代码匹配你的嵌套结构。 现在,坏消息是:你无法用单一模式从其他深度捕捉“条件”和“内容”! 一种方法是制作一个递归函数,在“内容”上重试模式,并在没有更多嵌套“if”时停止。请记住,此方法具有巨大的复杂性(在算法意义上)并且最好的方式(你知道)是使用DOM