PHP格式化正则表达式 - BBCode

时间:2010-05-24 21:20:41

标签: php html regex parsing bbcode

老实说,我非常喜欢正则表达式,我会使用RegexBuddy,但我正在使用我的Mac,有时对我来说没有多大帮助(对我而言)。

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

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

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

[[]] = 粗体格式

** ** = 斜体格式

(())= h2标题

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

P.S - 有没有像RegexBuddy这样的软件适用于Mac(Snow Leopard)?

3 个答案:

答案 0 :(得分:2)

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”。

答案 1 :(得分:1)

使用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
  );
}

答案 2 :(得分:0)

修饰符也可以提供帮助:)

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

  

U (PCRE_UNGREEDY)此修饰符   颠倒了“贪婪”   量词使他们不是   贪婪默认,但变得贪婪   如果紧接着?它不兼容   与Perl。它也可以由a设置   (?U)内的修饰符设置   模式或背后的问号   量词(例如*?)。