如果条件,PHP嵌套

时间:2013-04-07 12:25:11

标签: php regex nested

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

<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>

不使用domdocument如何用正则表达式解决这个问题?

2 个答案:

答案 0 :(得分:1)

你做不到。按照设计,正则表达式不能处理递归。

有关详细信息,您可能需要阅读第一个答案:Can regular expressions be used to match nested patterns?

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

答案 1 :(得分: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