これが私の状況です。リンクのマークダウンを認識したい(この場合、特定のスタイルのリンクだけで問題ありません。これは次の形式です。[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インラインスタイル)リンクの一部であることを確認する必要があります。