在
这产生
我需要准备一个可用于删除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]