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

标签 javascript jquery html regex angularjs

我一直在努力寻找问题的稳定解决方案。 我需要将字符串中的所有 http/https 链接设置为可点击链接。但仅限于“a”标签的“href”属性中的链接,而忽略其他所有内容。

我一直在使用这个简单的函数来链接文本 -

  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>");
}

但问题是它也将任何“img”标签的“src”属性中的链接转换为可点击链接。这是我不想要的。 我需要链接的字符串可以包含“a”和“img”标签。

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

由于我使用 angular.js,我还使用内置的“linky”过滤器( https://docs.angularjs.org/api/ngSanitize/filter/linky )来链接文本,但问题仍然存在。

上述所有解决方案都链接“a”和“img”标签中的文本。

寻求帮助!谢谢。

最佳答案

JavaScript 缺乏对正则表达式中的负向后查找的支持。这是简单的解决方法:

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 .

关于javascript - 正则表达式使链接可点击(仅在 'a href' 而不是 'img src' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29055828/

相关文章:

jquery - 使用 QUnit 测试悬停 CSS 属性

html - 动态 img(或视频)标签根本不加载资源,HTTP 请求是 "pending"

javascript - Ajax 请求在 IE 9.0 中有效,但在 Firefox 24.6 中无效

javascript - 如何执行 NON-LINK 的 JavaScript onClick?

jquery - 我可以在 jQuery 中多重选择对象变量吗?

javascript - onStateChange 用新元素替换类元素 youtube chromeless

jquery - 如何在屏幕上可见的 div 中应用视差滚动

html - 使最长的内容项设置整个列的宽度

javascript - 使用默认路由的 Express.js 路由

javascript - 如何在 Google Analytics 中设置 AJAX 调用跟踪?