2

これが私の状況です。リンクのマークダウンを認識したい(この場合、特定のスタイルのリンクだけで問題ありません。これは次の形式です。[link text](url "optional title")、そして私がやろうとしているのは、このマークダウンテキストをタグに入れ、URLをタグ<pre>で適切にラップすることです。<a>

疑似例:

変換

[link text](url "optional title")

[link text](<a href='url'>url</a> "optional title")

だから私はこれであるMarkdownパーサーによって使用される非常に正規表現を掘り起こしました:

/*
text = text.replace(/
    (                           // wrap whole match in $1
        \[
        (
            (?:
                \[[^\]]*\]      // allow brackets nested one level
                |
                [^\[\]]         // or anything else
            )*
        )
        \]
        \(                      // literal paren
        [ \t]*
        ()                      // no id, so leave $3 empty
        <?(                     // href = $4
            (?:
                \([^)]*\)       // allow one level of (correctly nested) parens (think MSDN)
                |
                [^()\s]
            )*?
        )>?                
        [ \t]*
        (                       // $5
            (['"])              // quote char = $6
            (.*?)               // Title = $7
            \6                  // matching quote
            [ \t]*              // ignore any spaces/tabs between closing quote and )
        )?                      // title is optional
        \)
    )
/g, writeAnchorTag);
*/

text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag);

素敵なコメントの内訳は、何が起こっているのかを確認するのに大いに役立ちます。明らかに、私がする必要があるのは、$4サブマッチをに置き換えることだけです<a href='$4'>$4</a>

しかしもちろんstr.replace(re,"<a href='$4'>$4</a>");、それが私のMarkdownリンクマークアップ全体(リンクテキストとオプションのタイトルを含む)をプレーンリンクに置き換えるので、私はそれを行うことはできません。プレーンリンクを元のMarkdownに表示して、元のMarkdownと同じように見えるようにします<pre>(ただし、クリック可能なリンクが含まれています)。

だから、見てみましょう...

抽出$4

var group_4 = str.replace(re, "$4"); // Does anybody know a more efficient way to do this? I'm not trying to replace I just need to get the 4th group

"<a href='"+group_4+"'>"+group_4+"</a>"さてここで私はの代わりとして固執したいので立ち往生してい$4ます。

誰かが私のためのヒントを持っていますか?私はこれができるとかなり確信しています、そして私はそれがエレガントにもできると思います。

グループの外にある正規表現のセクションを取り除くことである1つの潜在的な解決策(これは間違っています)をすでに見つけました$4。リンクの内容に基づいて実際のリンク検出を行わないため、これでは十分ではないと思います(つまり、実際のリンクではないものを使用してMarkdownリンクを定義できます)。したがって、元の正規表現を使用して、変換するもの<a>が実際に(Markdownインラインスタイル)リンクの一部であることを確認する必要があります。

4

1 に答える 1

0

すでに知っていることを使って問題に取り組む方法があると思います。純正部品と交換するだけ。これは、 の前後の式全体をカバーする他のサブマッチが必要であることを意味し$4ます。$x文字列の最初から最後までの一致を含むグループと、文字列の最後から最後までの一致を含む$4別のグループがあると仮定すると、私がしなければならないことは、それで完了です。$y$4str.replace(re,"$x<a href='$4'>$4</a>$y")

これらのグループを提供している間、受け入れられる言語を変更しないように正規表現を変更できるかどうかを確認します。

更新: もう少し詳しく見てみると、実際には非常に基本的なものです。

str.replace(re,"[$2]($4 $5)")

元の入力を完全に複製する方法の 99% を取得します。これが正しくない唯一の部分は、入力の$4との間のスペースにあるため、元の入力の新しいグループにラップするだけです。正規表現。私はそれが次のようになると信じています:$5[ \t]*$5

/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?([ \t]*)((['"])(.*?)\6[ \t]*)?\))/g
                                                                      ^      ^

下の行のカラットは、括弧が追加された場所を示しています。

str.replace(re,"[$2]($4$5$6)")

正確なオリジナルを生成する必要があるため、

str.replace(re,"[$2](<a href='$4'>$4</a>$5$6)")

するべきです。

あとは、アンカー タグをエスケープしたくないので、これらのリンク構造の外側の HTML のみをエスケープする方法を考案することです。うーん。

于 2012-07-09T22:56:09.257 に答える