正则删除嵌套在bbcode标签中的bbcode标签



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

我正在使用的当前正则表达式来自此处的答案(包括以至于以下的正则说明):删除嵌套引号

~G(?!A)(?>([quoteb[^]]*](?>[^[]+|[(?!/?quote)|(?1))*[/quote])|(?<![)(?>[^[]+|[(?!/?quote))+K)|[quoteb[^]]*]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]

请参阅Regex101.com上的演示。


PHP中,这将是:
$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;
?>


这产生

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

最新更新