我查看了此链接中基本问题的答案:如何用链接替换纯 URL?并决定使用Christian Koch建议的代码,但它仅部分涵盖了我需要做的事情。我希望这里有人可以帮助我。
Christian Koch 提供的代码很好用,但有一个例外 - 当我的文本已经包含链接并且只是纯文本时,这些链接会得到一个双“a”标签,因此会导致 html 问题,使文本无法正确显示在浏览器中。
例如,代码可以正常工作:
www.yahoo.com is a website just like http://www.google.com
我看到 yahoo 和 google 文本现在显示为链接,并且正如我所期望的那样,它们周围都有一个链接包装器:
<a href="http://www.yahoo.com">www.yahoo.com</a> is a website just like <a href="http://www.google.com">http://www.google.com</a>
现在获取此文本(包含基本文本和已定义的链接):
www.yahoo.com is a website just like <a href="http://www.google.com">http://www.google.com</a>
使用提供的代码时,雅虎链接是正确的,但谷歌链接现在有一个双标签:
<a href="http://www.yahoo.com">www.yahoo.com</a> is a website just like <a href="<a href="http://www.google.com">http://www.google.com</a>" target="_blank"><a href="http://www.google.com">http://www.google.com</a></a>
有人可以帮我正确设置模式,以便当文本已经包含链接时,模式会忽略它,但仍会替换没有标签的其他文本。当且仅当文本尚未包含在链接标记中时,我才希望模式进行替换。
这是我在另一篇文章中使用的代码:
doLinks: function(originalText)
{
// http://, https://, ftp://
var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;
// www. sans http:// or https://
var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
// Email addresses *** here I've changed the expression ***
var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim;
return originalText
.replace(urlPattern, '<a target="_blank" href="$&">$&</a>')
.replace(pseudoUrlPattern, '$1<a target="_blank" href="http://$2">$2</a>')
.replace(emailAddressPattern, '<a target="_blank" href="mailto:$1">$1</a>');
}