RegEx删除嵌套在bbcode标记内的bbcode标记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RegEx删除嵌套在bbcode标记内的bbcode标记相关的知识,希望对你有一定的参考价值。

我需要准备一个正则表达式,当它嵌套在一个预先存在的[QUOTE]标签中时,可用于删除bbcode [QUOTE](例如:[QUOTE = name]; [QUOTE = 123; 123])标签。

我正在使用的当前正则表达式来自这里的答案(正则表达式的完整解释):Remove nested quotes

~G(?!A)(?>([quote[^]]*](?>[^[]+|[(?!/?quote)|(?1))*[/quote])|(?<![)(?>[^[]+|[(?!/?quote))+K)|[quote[^]]*]K~

但是,这只删除了第二个或后来的嵌套[QUOTE]标记,但是留下了一个嵌套标记,如果它们嵌套在现有的[QUOTE]标记中,我现在想要删除所有[QUOTE]标记。

输入的示例以及它应如何从preg_replace()输出:

//input
$string = 'Here is a quote [QUOTE=person]I am also quoting [QUOTE]this is a nested quote[/QUOTE][/QUOTE]';

//preg replace
$string = preg_replace('regular_expression', '', $string);

//output
echo $string;
// Here is a quote [QUOTE=person]I am also quoting[/QUOTE]
答案

您可以使用递归方法:

([QUOTE[^][]*])
(
    (?:[^][]+|(?R))+
)
[/QUOTE]

a demo on regex101.com


In php this would be:
$regex = '~
        ([QUOTE[^][]*])
        (
            (?:[^][]+|(?R))+
        )
        ([/QUOTE])
        ~x';

$string = 'Here is a quote [QUOTE=person]I am also quoting [QUOTE]this is a nested quote[/QUOTE][/QUOTE]';

$string = preg_replace_callback($regex, 
    function($match) {
        return $match[1] . preg_replace('~[/?[^][]*]~', '', $match[2]) . $match[3];
    },
    $string);

echo $string;
?>


This yields
Here is a quote [QUOTE=person]I am also quoting this is a nested quote[/QUOTE]

以上是关于RegEx删除嵌套在bbcode标记内的bbcode标记的主要内容,如果未能解决你的问题,请参考以下文章

跳过解析 CODE 标签内的 BBCode

PHP 和 RegEx:用不在括号内的逗号(以及嵌套括号)拆分字符串

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

使用 Python 访问 HTML <script> 标记内的深层嵌套数据

用于匹配嵌套括号内的特定文本的 C# 正则表达式

通过正则表达式删除嵌套在多个 html 标记中的特定单词