[英]Is there a (recursive) PCRE regexp in PHP to denest tags
我有一个初始字符串,其中的标签之间包含其他文本,并且该字符串可以包含嵌套标签。 我希望根据以下规则“删除”字符串:1)最终字符串与初始字符串没有区别,只是添加或删除了一些标签。 2)在最后一个字符串中,每段文本都由将其括在原始字符串中的最接近的一对标记包围。 如果有几个相等的近对,则结果未指定(但为3),则没有文本在最终字符串中归属新的标记)。
从而,
[a]text1[/a]text2[b]text3[c]text4[/c]text5[/b]
[e]text6[f]text7[/e]text8[/f]
应该成为
[a]text1[/a]text2[b]text3[/b][c]text4[/c][b]text5[/b]
[e]text6[/e]...[f]text8[/f]
其中…
可以是text7
, [e]text7[/e]
或[f]text7[/f]
。
是否有这样做的正则表达式(例如,PHP中的递归PCRE正则表达式)?
方法
执行3次替换:
搜索结束标记,然后搜索另一个结束标记==>为第二个插入开始标记。 例:
[/b]text[/c] ==> [/b][c]text[/c]
搜索一个开始标签,后跟一个标签,该标签不是与其刚刚找到的标签相对应的结束标签==>插入结束标签。 例:
[a]text[b] ==> [a]text[/a][b] [a]text[/b] ==> [a]text[/a][/b]
(修正为2)。 搜索2个连续的结束标签==>删除第二个。 例:
[a]text[/a][/b] ==> [a]text[/a]
码
$patterns = array ('#(\[/\w++])([^[]++\[/(\w++)])#',
'#\[(\w++)][^[]*+(?!\[/\1)#',
'#(\[/(\w++)])\[/\w++]#');
$replace = array ('\1[\3]\2',
'\0[/\1]',
'\1');
$string = "[a]text1[/a]text2[b]text3[c]text4[/c]text5[/b]\n[e]text6[f]text7[/e]text8[/f]";
$result = preg_replace($patterns, $replace, $string);
产量
[a]text1[/a]text2[b]text3[/b][c]text4[/c][b]text5[/b]
[e]text6[/e][f]text7[/f][f]text8[/f]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.