Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php RegEx删除嵌套在bbcode标记中的bbcode标记_Php_Regex_Nested_Bbcode - Fatal编程技术网

Php RegEx删除嵌套在bbcode标记中的bbcode标记

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[^][]*\])

我需要准备一个正则表达式,它可以用来删除bbcode[QUOTE] (示例:[QUOTE=name];[QUOTE=123;123])标记,当它嵌套在预先存在的[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]