首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多维BBCODE

多维BBCODE
EN

Stack Overflow用户
提问于 2021-09-15 14:21:54
回答 1查看 99关注 0票数 1

我正在努力使自己成为PHP中的BBCODE解析器。

现在我有了以下Regex:

代码语言:javascript
复制
\[quote\](.*?)\[\/quote\]

这应改为:

代码语言:javascript
复制
<div class='quote'><div class='quotetext'>$1</div></div>

这一切都很完美,直到我有了一个“多维”的帖子示例:

代码语言:javascript
复制
[quote] [quote] [quote] text [/quote] [/quote] [/quote]

这应产生以下结果:

代码语言:javascript
复制
<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>

现在,它得到了以下结果:

代码语言:javascript
复制
<div class='quote'><div class='quotetext'> [quote] [quote] text </div></div> [/quote] [/quote]

Php:

代码语言:javascript
复制
preg_replace("/\[quote\](.*?)\[\/quote\]/", "<div class='quote'><div class='quotetext'>$1</div></div>", $text); 

我希望有人能帮我解决这个问题。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-15 15:42:26

一次通过的正则方法:

  1. 构造了一个数组,它将bbcode标记与相应的html代码关联起来。
  2. 编写的模式能够匹配嵌套的(或不匹配)引用bbcode标记。兴趣将是双倍的,因为它只允许提取有效的部分(这些部分是平衡的),然后继续使用关联数组在回调函数中使用replacement.
  3. proceed简单地替换strtr

支持:这比较快,因为它只需要一次通过,并且由于使用了strtr

缺点:它不灵活,因为它只考虑像[quote]这样的标记,而不考虑[quote param="bidule"][QUOTE]。(但是,没有什么可以禁止编写更详细的回调函数和稍微改变模式)。

代码语言:javascript
复制
$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.

  • put

  • 构建了一种禁止嵌套引号标记的模式,这样,只有内部标记在when循环中被替换,并在没有更多的标记来替换(使用preg_replace计数参数知道)

时停止它

代码语言:javascript
复制
$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标记是出于什么原因?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69194933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档