Php RegEx删除嵌套在bbcode标记中的bbcode标记
我需要准备一个正则表达式,它可以用来删除bbcode[QUOTE] (示例:[QUOTE=name];[QUOTE=123;123])标记,当它嵌套在预先存在的[QUOTE]标记中时 我当前使用的正则表达式来自这里的答案(包括正则表达式的完整解释):Php RegEx删除嵌套在bbcode标记中的bbcode标记,php,regex,nested,bbcode,Php,Regex,Nested,Bbcode,我需要准备一个正则表达式,它可以用来删除bbcode[QUOTE] (示例:[QUOTE=name];[QUOTE=123;123])标记,当它嵌套在预先存在的[QUOTE]标记中时 我当前使用的正则表达式来自这里的答案(包括正则表达式的完整解释): 您可以使用递归方法: (\[QUOTE[^][]*\]) ( (?:[^][]+|(?R))+ ) \[/QUOTE\] 看。 在PHP中,这将是: $regex = '~ (\[QUOTE[^][]*\])
您可以使用递归方法:
(\[QUOTE[^][]*\])
(
(?:[^][]+|(?R))+
)
\[/QUOTE\]
看。
在
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]
可能是@mario的副本,这是我在上面显示的正则表达式,我以前使用过,我知道。这就引出了几个问题。为什么不事先提一下呢?为什么选择可读性最低的一个?你尝试过什么样的改编?现在这只是一个没有新上下文的重新发布。那么,为什么不简单地在原始问题上发布悬赏呢?我现在已经添加了悬赏。你说的最不可读的是什么意思?这是唯一有效的解决方案。在新的背景下,我寻找的解决方案与另一篇文章不同。可能
https://regex101.com/r/4vlEs4/1
足够了吗?这将删除外部引号内的所有嵌套引号。若要删除所有嵌套引用,需要用空字符串替换,直到找不到匹配项为止。
$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]