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


Replacing unique nested statement with regex or alternatives

从发布的无数问题中,我知道使用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

是否可以在没有结束块唯一的情况下使用regex?有没有regex的替代方案可以实现这一点?

我想用任意嵌套级别解析如下内容:[if@test]test[if@second]second[/if][/if]。如果regex不实用,有人能在PHP中提出可行的替代方案吗?

在一个合适的解决方案中,您应该将字符串标记为其基本组件,如标记、注释、文本和其他任何组件。此步骤可以使用regex完成,并生成令牌的平面列表。接下来,您将遍历令牌,构建一个解析树,其中包含所需的所有结构和细节。(两个步骤可以组合在一起,也可以一次性完成。)

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

另一方面,它可以使用regex来完成,但您会受到更大的限制,并且需要为每增加一个深度重新分析代码的嵌套部分。

由于您要求使用正则表达式,因此这里有一个正则表达式可以匹配此类嵌套的if s:

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