正则表达式使链接可点击(仅在'a href'而不是'img src')

时间:2015-03-15 00:16:10

标签: javascript jquery html regex angularjs

我一直在努力为问题寻找稳定的解决方案。 我需要将字符串中的所有http / https链接作为可点击链接。但只有那些在' href' ' a'的属性标记,忽略其他一切。

我一直在使用这个简单的功能来链接文字 -

  function linkify(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp, "<a target='_blank' href='$1'>$1</a>");
}

但问题是它会转换“src&#39;”中的链接。任何&#39; img&#39;的属性标记为可点击链接。这是我不想要的。 我需要链接的字符串可以包含&#39; a&#39;以及&#39; img&#39;标签

我甚至提到了这个链接 - How to replace plain URLs with links?并使用了这个 - https://github.com/cowboy/javascript-linkify,但仍然没有运气。

由于我使用的是angular.js,我还使用了内置链接&#39;过滤(https://docs.angularjs.org/api/ngSanitize/filter/linky)以链接文本,但问题仍然存在。

所有上述解决方案都将“&#39; a”中的文字联系起来。和&#39; img&#39;标签。

寻求帮助!感谢。

2 个答案:

答案 0 :(得分:1)

JavaScript在正则表达式中缺乏对负面lookbehinds的支持。这是一个简单的解决方法:

var content = '<a href="http://google.com">Google.com</a> and http://google.com';

var re = /((?:href|src)=")?(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

content = content.replace(re, function (match, attr) {
    if (typeof attr != 'undefined') {
        return match;
    }
    return '<a target="_blank" href="' + match + '">' + match +'</a>';
});

但是你应该避免使用RegExp解析HTML。 Here's why

答案 1 :(得分:0)

你最好的选择是使用HTML / XML解析器(如果适用的话,Nokogiri for Ruby仍然是我的最爱),以识别和解析“innerHTML”标签内容,你可以在其上运行这样的正则表达式。这是编程中的一个格言,你不应该使用正则表达式来解析XML。