Preg_replace正确放置多个bbcodes

时间:2011-08-17 14:51:49

标签: php regex preg-replace bbcode

Currenlty我正在创建一个bbCodes函数,用文本中相应的HTML代码替换所有bbCodes。我的代码就像这样atm:

public function bbCodes($text) {

    global $bb_codes;

    $text = preg_replace(array_keys($bb_codes), array_values($bb_codes), $text);

    return $text;

}

其中$ bb_codes如下所示:

$bb_codes = array(
            "/\[b\](.*)\[\/b\]/is" => "<b>$1</b>",
            "/\[u\](.*)\[\/u\]/" => "<u>$1</u>",
            "/\[i\](.*)\[\/u\]/" => "<i>$1</i>",
            "/\[d\](.*)\[\/d\]/" => "<del>$1</del>",
            "/\[url=(.*)\](.*)\[\/url\]/" => "<a href='$1'>$2</a>"
              );

当每个bbcode仅使用一次时,它正在工作,例如:

[b]this text is bold[/b]
[i]this text is italic[/i]
etc..

但是,一旦我多次使用一个bbcode标签,它就会搞砸了:

   [b]this text is bold[/b]
   [i]this text is italic[/i]
   [b]this text is bold too[/b]

它将看到第一个[b]标签并寻找另一个[/ b]标签,但它取最后一个而不是它遇到的第一个(在上面的例子中,所有文本都是粗体,第一个[b] ]并且最后[/ b]将被替换)。有谁知道我做错了什么以及如何解决这个问题?

先谢谢!

干杯。

2 个答案:

答案 0 :(得分:3)

您需要使用非贪婪的通配符,而不是所有.*.*?

答案 1 :(得分:0)

为什么你不使用BBCode Parser? 看看NBBC Parser。

要安装它,只需将其放入服务器上的有用文件夹中,并将其连接,就像我稍后提供的链接一样:)

<?php
    require_once("nbbc.php");
    $bbcode = new BBCode;
    print $bbcode->Parse("[i]Hello, World![/i]  This is the magic of [b]BBCode[/b]!");
?>