1

正直なところ、私は正規表現を非常に嫌いで、正規表現を使用しますが、私はMacで作業していて、(私にとっては)あまり役に立たないことがあります。

さて、私がする必要があるのはphpの関数です

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

これは、誰かが]]または[[を使用してタグを閉じなかった場合の悪い例ですが、とにかく、次の正規表現を手伝ってもらえますか?

[[]]=太字形式

****=イタリック形式

(())= h2見出し

必要なのはこれだけです、ありがとう:)

PS-Mac(Snow Leopard)で利用できるRegexBuddyのようなソフトウェアはありますか?

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 に答える