我需要解析以下格式中带有链接的文本:
[html title](http://www.htmlpage.com)
http://www.htmlpage.com
http://i.imgur.com/OgQ9Uaf.jpg
这两个字符串的输出结果将会是:
<a href='http://www.htmlpage.com'>html title</a>
<a href='http://www.htmlpage.com'>http://www.htmlpage.com</a>
<a href='http://i.imgur.com/OgQ9Uaf.jpg'>http://i.imgur.com/OgQ9Uaf.jpg</a>
字符串中可能包含任意数量的这些链接,即:
[html title](http://www.htmlpage.com)[html title](http://www.htmlpage.com)
[html title](http://www.htmlpage.com) [html title](http://www.htmlpage.com)
[html title](http://www.htmlpage.com) wejwelfj http://www.htmlpage.com
输出:
<a href='http://www.htmlpage.com'>html title</a><a href='http://www.htmlpage.com'>html title</a>
<a href='http://www.htmlpage.com'>html title</a> <a href='http://www.htmlpage.com'>html title</a>
<a href='http://www.htmlpage.com'>html title</a> wejwelfj <a href='http://www.htmlpage.com'>http://www.htmlpage.com</a>
我有一个非常冗长的函数,通过3次传递字符串可以完成不错的工作,但是我无法成功解析这个字符串:
[This](http://i.imgur.com/iIlhrEu.jpg) one got me crying first, then once the floodgates were opened [this](http://i.imgur.com/IwSNFVD.jpg) one did it again and [this](http://i.imgur.com/hxIwPKJ.jpg). Ugh, feels. Gotta go hug someone/something.
为了简洁起见,我将发布我尝试过的正则表达式,而不是整个查找/替换函数:
var matchArray2 = inString.match(/\[.*\]\(.*\)/g);
针对匹配[*](*)
的问题,不起作用是因为它匹配了[]()[]()
就是这样,我想。一旦我进行了这个匹配,我会搜索该匹配项以查找()和[]以解析出链接和链接文本并构建href标记。我从临时字符串中删除匹配项,这样当我进行第二次查找以查找普通超链接时,就不会再次匹配它们:
var plainLinkArray = tempString2.match(/http\S*:\/\/\S*/g);
我不是用正则表达式解析任何HTML。我正在解析一个字符串,并尝试输出HTML。
编辑:我事后添加了要求它解析第三个链接http://i.imgur.com/OgQ9Uaf.jpg。
我的最终解决方案(基于@Cerbrus的答案):
function parseAndHandleHyperlinks(inString)
{
var result = inString.replace(/\[(.+?)\]\((https?:\/\/.+?)\)/g, '<a href="$2">$1</a>');
return result.replace(/(?: |^)(https?\:\/\/[a-zA-Z0-9/.(]+)/g, ' <a href="$1">$1</a>');
}
[标题](网址)
或[标题][1] <....> [1]:网址
。像这样的解析器在论坛和其他社区网站上非常有用。 - Cerbrus