我正在努力使自己成为PHP中的BBCODE解析器。
现在我有了以下Regex:
\[quote\](.*?)\[\/quote\]这应改为:
<div class='quote'><div class='quotetext'>$1</div></div>这一切都很完美,直到我有了一个“多维”的帖子示例:
[quote] [quote] [quote] text [/quote] [/quote] [/quote]这应产生以下结果:
<div class='quote'><div class='quotetext'>
<div class='quote'><div class='quotetext'>
<div class='quote'><div class='quotetext'>
text
</div></div>
</div></div>
</div></div>现在,它得到了以下结果:
<div class='quote'><div class='quotetext'> [quote] [quote] text </div></div> [/quote] [/quote]Php:
preg_replace("/\[quote\](.*?)\[\/quote\]/", "<div class='quote'><div class='quotetext'>$1</div></div>", $text); 我希望有人能帮我解决这个问题。谢谢
发布于 2021-09-15 15:42:26
一次通过的正则方法:
strtr。支持:这比较快,因为它只需要一次通过,并且由于使用了strtr。
缺点:它不灵活,因为它只考虑像[quote]这样的标记,而不考虑[quote param="bidule"]或[QUOTE]。(但是,没有什么可以禁止编写更详细的回调函数和稍微改变模式)。
$corr = [
'[quote]' => '<div class="quote"><div class="quotetext">',
'[/quote]' => '</div></div>'
];
$pat = '~ \[quote]
# all that is not a quote tag
(?<content> [^[]*+ (?: \[ (?! /?quote] ) [^[]* )*+ )
# an eventual recursion ( (?R) is a reference to the whole pattern)
(?: (?R) (?&content) )*+
\[/quote]
~x';
$result = preg_replace_callback($pat, fn($m) => strtr($m[0], $corr), $str);这是一种更经典的方法,有几个通行证:
replaced.
preg_replace计数参数知道)时停止它
$pat = '~ \[quote] ( [^[]*+ (?: \[ (?! /? quote] ) [^[]* )*+ ) \[/quote] ~x';
$repl = '<div class="quote"><div class="quotetext">$1</div></div>';
$result = $str;
$count = 0;
do {
$result = preg_replace($pat, $repl, $result, -1, $count);
} while($count); pro:比第一种方法更灵活,因为您可以轻松地更改模式和替换字符串。
缺点:很明显慢,因为您需要n+1循环,其中n是最大嵌套级别。
顺便提一下:当您只需要一个html标记时,以及当blockquote标记存在时,您想要用两个div替换糟糕的blockquote标记是出于什么原因?
https://stackoverflow.com/questions/69194933
复制相似问题