【问题标题】:Preg_replace multiple bbcodes correctlyPreg_replace 正确替换多个 bbcode
【发布时间】:2011-08-17 14:51:49
【问题描述】:

当前我正在创建一个 bbCodes 函数,以将所有 bbCodes 替换为文本中相应的 HTML 代码。我的代码是这样工作的:

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] 将被替换)。有谁知道我做错了什么以及如何解决这个问题?

提前致谢!

干杯。

【问题讨论】:

    标签: php regex preg-replace bbcode


    【解决方案1】:

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

    【讨论】:

    • 您可能想详细说明,但这是正确的答案。
    • 不知道会这么简单,谢谢修复。仍然不太确定它代表什么,但我会查一下。编辑:找到它并且我理解它的用途,正是我的问题的解决方案。
    • 不,正确的答案是不推荐正则表达式,而是推荐a proper parser
    • @Tomalak touche...(使用正确的解析器)
    • @Skyfe:Regex 无法解析嵌套结构,例如 BBcode(或 HTML 或 XML 或任何其他类型的复杂语言)。正则表达式可以解析 regular 语言(因此得名)。 BBcode 不是常规语言。尝试使用正则表达式处理它最多可能会失败,最坏的情况会导致您的应用程序出现安全漏洞。 更是如此如果您对正则表达式如此陌生以至于您不知道.*?。既然已经有一个可用于 PHP 的 BBcode 解析器,请投资一些并了解它是如何工作的;从长远来看,你会变得更好。
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2012-08-24
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多