2

好吧,我正在为我拥有的论坛使用一个小 bbcode 功能,运行良好,所以如果,例如,我把

[b]Text[/b]

它将以粗体打印文本。

我的问题是,如果我有该代码:

[b]
Text[/b]

好吧,它不起作用,只需按现在的方式打印即可。

这是我正在使用的函数的示例:

function BBCode ($string) {
$search = array(
    '#\[b\](.*?)\[/b\]#',
);
$replace = array(
    '<b>\\1</b>',
);
return preg_replace($search , $replace, $string);
}

然后在回显它时:

.nl2br(stripslashes(BBCode($arr_thread_row[main_content]))).

所以我的问题是,什么是必要的,这样 BBcode 才能与其中的所有内容一起工作,但不一定在同一行。

例如:

[b]




Text



[/b]

简直就是

文本

感谢您的任何帮助!

亚历克斯

4

3 回答 3

2

您需要multiline 修饰符,这使您的模式类似于#\[b\](.*?)\[/b\]#ms

(注意尾随m

于 2010-09-28T00:56:41.447 回答
2

实际上有一个解析 BBcode 的pecl 扩展,它比自己从头开始编写它更快,更安全。

于 2010-09-28T00:57:31.350 回答
0

我用这个......它应该工作。

$bb1 = array(
"/\[url\](.*?)\[\/url\]/is",
"/\[img\](.*?)\[\/img\]/is",
"/\[img\=(.*?)\](.*?)\[\/img\]/is",
"/\[url\=(.*?)\](.*?)\[\/url\]/is",
"/\[red\](.*?)\[\/red\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[h(.*?)\](.*?)\[\/h(.*?)\]/is",
"/\[php\](.*?)\[\/php\]/is"
);

$bb2 = array(
'<a href="\\1">\\1</a>',
'<img alt="" src="\\1"/>',
'<img alt="" class="\\1" src="\\2"/>',
'<a rel="nofollow" target="_blank" href="\\1">\\2</a>',
'<span style="color:#ff0000;">\\1</span>',
'<span style="font-weight:bold;">\\1</span>',
'<h\\1>\\2</h\\3>',
'<pre><code class="php">\\1</code></pre>'
);

$html = preg_replace($bb1, $bb2, $html);
于 2010-09-28T01:10:44.050 回答