gpt4 book ai didi

php - 递归正则表达式不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:09:19 24 4
gpt4 key购买 nike

我处理的字符串看起来像这样:

abc {def ghi {jkl mno} pqr stv} xy z

而且我需要把括号中包含的数字放在标签中,所以它应该看起来像这样

abc <tag>def ghi <tag>jkl mno</tag> pqr stv</tag> xy z

我试过了

'#(?<!\pL)\{  ( ([^{}]+) | (?R) )*  \}(?!\pL)#xu'

但我得到的只是<tag>xy z</tag> .请帮忙,我做错了什么?

最佳答案

根据定义,嵌套结构对于正则表达式来说太复杂了(是的,PCRE 支持递归,但这对这个替换问题没有帮助)。您有两种可能的选择(无论如何都使用正则表达式)。首先,您可以简单地通过打开标签替换左括号,关闭标签也是如此。然而,这也会转换不匹配的括号:

$str = preg_replace('/\{/', '<tag>', $str);
$str = preg_replace('/\}/', '</tag>', $str);

另一种选择是只替换匹配的 {},但是你必须重复这样做,因为一次调用 preg_replace 不能替换多个嵌套级别:

do
{
$str = preg_replace('/\{([^{]*?)\}/', '<tag>$1</tag>', $str, -1, $count);
}
while ($count > 0)

编辑:虽然 PCRE 支持使用 (?R) 进行递归,但这很可能对替换没有帮助。原因是,如果重复捕获组,它的引用将只包含最后一次捕获(即在 aaaab 中匹配 /(a|b)+/ 时,$1 将包含 b)。我想这对于递归是一样的。这就是为什么您只能替换最里面的匹配项,因为它是递归中捕获组的最后一个匹配项。同样,您不能尝试使用递归捕获 {} 并替换它们,因为它们也可能匹配任意次数,并且只会替换最后一个匹配项.

只是匹配一个正确的嵌套语法,然后替换最里面或最外面的匹配括号也无济于事(使用一个 preg_replace 调用),因为多个匹配永远不会重叠(所以如果 3 个嵌套括号已经找到,内部 2 个括号本身将被忽略以进行进一步的匹配。

关于php - 递归正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12864081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com