我正在使用模板系统。在这个模板系统中,我使用下面显示的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如何用正则表达式解决这个问题?
答案 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