1

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

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

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

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

[[ ]] =粗体格式

** ** =斜体格式

(( )) = h2 航向

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

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

4

3 回答 3

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

于 2010-05-24T21:33:59.477 回答
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
  );
}
于 2010-05-24T21:40:10.023 回答
0

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

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

U (PCRE_UNGREEDY) 此修饰符反转量词的“贪心”,使它们默认不贪心,但如果后跟?它与 Perl 不兼容。它也可以通过模式中的 (?U) 修饰符设置或量词后面的问号(例如 .*?)来设置。

于 2010-05-24T21:44:40.253 回答