我需要准备一个正则表达式,当它嵌套在一个预先存在的[QUOTE]标签中时,可用于删除bbcode [QUOTE](例如:[QUOTE = name]; [QUOTE = 123; 123])标签。
我正在使用的当前正则表达式来自这里的答案(正则表达式的完整解释):Remove nested quotes
~\G(?!\A)(?>(\[quote\b[^]]*](?>[^[]+|\[(?!/?quote)|(?1))*\[/quote])|(?<!\[)(?>[^[]+|\[(?!/?quote))+\K)|\[quote\b[^]]*]\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\]
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;
?>
Here is a quote [QUOTE=person]I am also quoting this is a nested quote[/QUOTE]