用正则表达式或替代方法替换唯一的嵌套语句

时间:2012-03-09 17:44:58

标签: php regex

从发布的无数问题中我知道使用正则表达式替换嵌套语句是不可能/不可取的。

我想知道在语句是唯一的情况下它是否有任何区别:

[if @test]TEST[if @second]SECOND[/if][/if]

当端块也是唯一的时候我已经知道它了,我知道这是笨拙的解决方法:

[if @test]TEST[if @second]SECOND[/if @second][/if @test]
$pattern = '%\[if @'.$dynamic.'.*?\](.*?)\[/if @'.$dynamic.'\]%s'; //Works with above

是否可以在没有结束块唯一的情况下使用正则表达式?是否有正则表达式的替代方案可以实现这一目标?

我想解析类似的东西:[if @test] TEST [if @second] SECOND [/ if] [/ if]具有任意嵌套级别。如果正则表达式不实用,那么有人可以在PHP中提出可行的替代方案吗?

1 个答案:

答案 0 :(得分:4)

在正确的解决方案中,您应该将字符串标记到其基本组件,例如标签,注释,文本以及其他任何内容。此步骤可以使用regex完成,并生成令牌的平面列表。接下来,您将通过构建解析树的标记来获取所需的所有结构和详细信息。 (两个步骤也可以组合在一起完成。)

这样一切都在你的控制之下,你不需要重新解析代码的任何部分。

另一方面,它可以使用正则表达式来完成,但是你会受到更多限制,并且你需要为每个增加的深度重新解析代码的嵌套部分。

由于您要求正则表达式,以下是匹配此类嵌套if的内容:

~
\[if\ @(\w++)]
(
    (?>
        (?: (?!\[if\ @\w++]|\[/if]) . )++
        |
        (?R)
    )*+
)
\[/if]
~xs