这是我的情况。我想为链接识别 Markdown(在这种情况下,只有一种特定样式的链接很好,它是这种格式:[link text](url "optional title")
,我想要做的是将此 Markdown 文本放入<pre>
标签中,并将 URL 适当地包裹在<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
submatch替换为<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
.
有人对我有提示吗?我很确定这是可以做到的,我怀疑它也可以优雅地完成。
我已经找到了一种潜在的解决方案(这是错误的),即去掉 group 之外的正则表达式部分$4
。我认为这还不够,因为它不会根据链接内容进行任何实际的链接检测(即,您可以使用根本不是真正链接的东西来定义 Markdown 链接)。所以我应该使用原始的正则表达式,以确保我转换成的<a>
实际上是(Markdown 内联样式)链接的一部分。