3

我查看了此链接中基本问题的答案:如何用链接替换纯 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>');
}
4

2 回答 2

2

好吧,在再看问题之后,我开始相信几个子模式的组合会比一个巨型模式做得更好。所以我将 pseudoUrlPattern 分为两部分,一个用于行首的 url,一个用于给定文本中的每个其他 url。考虑以下修改后的代码,并附上我的测试文本:

  var doLinks = function(originalText) {

        var urlPattern = /[^<>]\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|](?![^<>])/gim;

        var pseudoUrlPattern1 = /^([^\/])?(www\.[\S]+(\b|$|[^<>]))/gim
        var pseudoUrlPattern2 = /([^\/"><])(www\.[\S]+(\b|$))(?![^<>])?/gim;

        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(pseudoUrlPattern1, '$1<a target="_blank" href="http://$2">$2</a>')
            .replace(pseudoUrlPattern2, '$1<a target="_blank" href="http://$2">$2</a>')
            .replace(emailAddressPattern, '<a target="_blank" href="mailto:$1">$1</a>');
    }    

    var string = 'www.yahoo.com is a website just like <a href="http://www.google.com">http://www.google.com</a> and not like <a href="www.facebook.com "> www.facebook.com </a> and not like www.example.com';

试一试,告诉我结果如何。

需要注意的一件事:已经在锚标签中的 url 最好在 url 和标签之间不应该有任何空格。

于 2013-01-04T18:37:24.570 回答
1

当 URL 在引号'或双引号中时,禁止替换"

// 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;

也许您需要转义引号或双引号。我没有测试它。

顺便说一句:您的正则表达式与所有域名都不匹配。国际化域名越来越多。请参阅德语维基百科中的示例

于 2013-01-04T18:38:47.427 回答