BBCode仅使用第一个替换而不使用其他替换

时间:2014-03-15 00:37:16

标签: php arrays preg-replace bbcode

下面的代码只会使用数组中的第一行(使文本变为粗体)。

function bbcode($string) {

    $codes = Array(
        '/\[b\](.+?)\[\/b\]/' => '<b>\1</b>',
        '/\[i\](.+?)\[\/i\]/' => '<i>\1</i>',
        '/\[u\](.+?)\[\/u\]/' => '<u>\1</u>',
        '/\[s\](.+?)\[\/s\]/' => '<s>\1</s>',
        '/\[url=(.+?)\](.+?)\[\/url\]/' => '<a href="\1">\2</a>',
        '/\[image=(.+?)\]/' => '<div class="centered"><img src="\1" alt=""></div>'
    );

    while($replace = current($codes)) {
        $bbcode = preg_replace(key($codes), $replace, $string);
        next($codes);

        return stripslashes(nl2br($bbcode));
    }

}

echo bbcode('[b]This text[/b] will be bold and also [b]this text[/b]. But when I use some other BBCodes, it will [u]not[/u] work as planned. Here's a [url=http://google.com/]link[/url] too which will not be replaced as planned.');

输出:此文字将为粗体,此文字。但是当我使用其他bbcode时,[u]not[/u]将按计划工作。这里也是[url=http://google.com/]link[/url],不会按计划更换。

我怎样才能让我的代码在数组中搜索正确的BBCode并用密钥替换它?

1 个答案:

答案 0 :(得分:0)

preg_replace也接受数组以及模式和替换 使用替换部分中的符号$n代替为模式保留的\n

这是我要做的:

function bbcode($string) {
    $codes = Array(
        '/\[b\](.+?)\[\/b\]/' => '<b>$1</b>',
        '/\[i\](.+?)\[\/i\]/' => '<i>$1</i>',
        '/\[u\](.+?)\[\/u\]/' => '<u>$1</u>',
        '/\[s\](.+?)\[\/s\]/' => '<s>$1</s>',
        '/\[url=(.+?)\](.+?)\[\/url\]/' => '<a href="$1">$2</a>',
        '/\[image=(.+?)\]/' => '<div class="centered"><img src="$1" alt=""></div>'
    );
    $bbcode = preg_replace(array_keys($codes), array_values($codes), $string);
    return stripslashes(nl2br($bbcode));
}