无序的bbcode元素

时间:2013-02-17 15:29:49

标签: php preg-replace bbcode

我在php中使用preg编码了一下,所以我可以自己编写一些bbcodes。

一开始效果不错,但我发现当我做[b]Stuff stuff [b]and more stuff[/b][/b]这样的事情时,它的输出就像东西[b]和更多东西 [/ b]

因为我无法做到的是让它找到所有关闭标签中的最后一个[b] [/ b]主要是为了消除这个问题,但似乎对我没有任何作用

代码正在运行

$bbcode = "[b]Stuff stuff [b]and more stuff[/b][/b]";
$bb[] = "#\[b\](.*?)\[/b\]#i";
$html[] = "<b>\\1</b>";
$bbcode = preg_replace($bb, $html, $bbcode);
return $bbcode;

我尝试通过制作另一行

来提供类似东西和更多东西的输出
$bbcode = "[b]Stuff stuff [b]and more stuff[/b][/b]";
$bb[] = "#\[b\]#i";
$html[] = "<b>";
$bb[] = "#\[/b\]#i";
$html[] = "</b>";
$bbcode = preg_replace($bb, $html, $bbcode);
return $bbcode;

但是这并没有停止执行任何像死角[/ b]那样的死胡同标签 关于如何找到第一个[b]和最后一个[/ b]而不与其他新的开放标签发生碰撞的任何想法?

1 个答案:

答案 0 :(得分:0)

对于bbcode替换的这种特殊情况,一种简单的方法是将[b]替换为<b>,将[/b]替换为</b>,而不是尝试捕获内部的内容。

使用str_ireplace:

$source = str_ireplace(array('[b]', '[/b]'), array('<b>', '</b>'), $source);

或使用preg_replace:

$source = preg_replace('~\[(/?b)]~i', '<$1>', $source);