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

Php 用正则表达式或替代项替换唯一嵌套语句,php,regex,Php,Regex,从发布的无数问题中,我知道使用正则表达式替换嵌套语句是不可能/不可取的 我想知道,在语句唯一的情况下,这是否会有什么不同: [if @test]TEST[if @second]SECOND[/if][/if] 当端块也是唯一的时候,我就开始工作了,我知道这是一个笨拙的解决方法: [if @test]TEST[if @second]SECOND[/if @second][/if @test] $pattern = '%\[if @'.$dynamic.'.*?\](.*?)\[/if @'.$d

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

我想知道,在语句唯一的情况下,这是否会有什么不同:

[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]。如果正则表达式不实用,有人能推荐PHP中可行的替代方案吗?

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

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

另一方面,它可以用正则表达式来完成,但这样做的限制更大,需要为每一个增加的深度重新分析代码的嵌套部分

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


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

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

另一方面,它可以用正则表达式来完成,但这样做的限制更大,需要为每一个增加的深度重新分析代码的嵌套部分

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


你想达到什么目的?请提供带有所需输出的示例输入。我将编辑问题,但目标是使用正则表达式进行替换,而不需要唯一的结束块,只是唯一的开始。问题不是真正的嵌套,而是任意嵌套。例如,我可以很容易地编写一个正则表达式来解析[b[c[d[e]f]g]h]I的各个部分,如果我知道括号将精确嵌套四个深度,并且每组括号中正好嵌套了一组括号;但是如果同一个正则表达式需要能够处理a[b[c]d[e[f[g]h[i[j[k[l]m[n]o]p]q]r]s[t]u]v]w,那么它就不能用真正的正则表达式来实现,PHP也不支持可能实现它的扩展。你所说的一切都是有意义的——这就是我最近发现的。不过,我很好奇,如果正则表达式不能做到这一点,PHP中是否有可行的替代方案?正如Madbreaks所说,您需要解释您试图用示例输出做什么。PHP/PCRE确实支持匹配任意嵌套的结构,例如?R、?1等,但这些表达式的使用可能有点棘手。它很容易匹配最里面和最外面的元素。使用回调也可以进行中间匹配。您试图实现的是什么?请提供带有所需输出的示例输入。我将编辑问题,但目标是使用正则表达式进行替换,而不需要唯一的结束块,只是唯一的开始。问题不是真正的嵌套,而是任意嵌套。例如,我可以很容易地编写一个正则表达式来解析[b[c[d[e]f]g]h]I的各个部分,如果我知道括号将精确嵌套四个深度,并且每组括号中正好嵌套了一组括号;但是如果同一个正则表达式需要能够处理a[b[c]d[e[f[g]h[i[j[k[l]m[n]o]p]q]r]s[t]u]v]w,那么它就不能用真正的正则表达式来实现,PHP也不支持可能实现它的扩展。你所说的一切都是有意义的——这就是我最近发现的。不过,我很好奇,如果正则表达式不能做到这一点,PHP中是否有可行的替代方案?正如Madbreaks所说,您需要解释您试图用示例输出做什么。PHP/PCRE确实支持匹配任意嵌套的结构,例如?R、?1等,但这些表达式的使用可能有点棘手。它很容易匹配最里面和最外面的元素。也可以使用callback.Yup进行中间匹配。这将与最外层的IF元素匹配+1是的。这将与最外层的IF元素匹配+1.
~
\[if\ @(\w++)]
(
    (?>
        (?: (?!\[if\ @\w++]|\[/if]) . )++
        |
        (?R)
    )*+
)
\[/if]
~xs