【问题标题】:PHP Formatting Regex - BBCodePHP 格式化正则表达式 - BBCode
【发布时间】:2010-05-24 21:20:41
【问题描述】:

老实说,我非常不擅长正则表达式,我会使用 RegexBuddy,但我正在使用我的 Mac,有时它并没有多大帮助(对我来说)。

好吧,我需要做的是php中的一个函数

function replaceTags($n)
{
    $n = str_replace("[[", "<b>", $n);
    $n = str_replace("]]", "</b>", $n);
}

虽然这是一个不好的例子,以防有人没有使用 ]] 或 [[ 关闭标签,但无论如何,你能帮助使用正则表达式:

[[ ]] = 粗体格式

** ** = 斜体格式

(( )) = h2 标题

这些都是我需要的,谢谢:)

P.S - 是否有任何类似 RegexBuddy 的软件可用于 Mac (Snow Leopard)?

【问题讨论】:

  • 我会在 regexlib.com 上查看已经制作的任何内容。此外, 标签已过时,请改用

标签: php html regex parsing bbcode


【解决方案1】:
function replaceTags($n)
{
    $n = preg_replace("/\[\[(.*?)\]\]/", "<strong>$1</strong>", $n);
    $n = preg_replace("/\*\*(.*?)\*\*/", "<em>$1</em>", $n);
    $n = preg_replace("/\(\((.*?)\)\)/", "<h2>$1</h2>", $n);
    return $n;
}

我可能应该提供一点解释:每个特殊字符前面都有一个反斜杠,因此它不被视为正则表达式指令(“[”、“(”等)。“(。*?)”捕获所有字符在您的分隔符之间(“[[”和“]]”等)。然后在替换字符串中输出捕获的内容以代替“$1”。

【讨论】:

  • 您可能希望将匹配中的.* 更改为非贪婪的.*?,以便[[bold]] not bold [[bold]] 不会导致&lt;strong&gt;bold]] not bold [[bold&lt;/strong&gt;
【解决方案2】:

您不能对str_replace() 执行此操作的相同原因也适用于preg_replace()。如果您想产生 100% 的准确率并覆盖输入错误,则标签对样式解析需要词法分析器/解析器。

正则表达式不能处理未闭合标签、嵌套标签之类的东西。

话虽如此,您可以毫不费力地完成 50% 的目标。

$test = "this is [[some]] test [[content for **you** to try, ((does [[it]])) **work?";

echo convertTags( $test );

// only handles validly formatted, non-nested input
function convertTags( $content )
{
  return preg_replace(
      array(
          "/\[\[(.*?)\]\]/"
        , "/\*\*(.*?)\*\*/"
        , "/\(\((.*?)\)\)/"
      )
    , array(
          "<strong>$1</strong>"
        , "<em>$1</em>"
        , "<h2>$1</h2>"
      )
    , $content
  );
}

【讨论】:

    【解决方案3】:

    修饰符也有帮助:)

    http://lv.php.net/manual/en/reference.pcre.pattern.modifiers.php

    U (PCRE_UNGREEDY) 这个修饰符 颠覆了“贪婪”的 量词,使它们不是 默认贪婪,但变得贪婪 如果后面跟着?。它不兼容 与 Perl。它也可以由一个 (?U) 修饰符设置 图案或后面的问号 量词(例如 .*?)。

    【讨论】:

      最近更新 更多