Javascript 创建动态链接但忽略现有链接

标签 javascript

我用它在网页中动态创建链接:

var linkWord = function(obj){
  for(i in obj){  
    var x = document.body.innerHTML;   

    var linkStart = '<a href="'+obj[i]+'">';
    var linkEnd = '</a>';
    var reg = new RegExp("\\b(" + i + ")\\b","ig"); 
    x = x.replace(reg, linkStart + i + linkEnd);
    document.body.innerHTML = x;

  }
  console.log(obj);
}

linkWord({
  'The':'http://www.example.com',
  'Vokalia':'http://icant.co.uk',
  'Brent':'http://google.com', 
});

这会在页面中创建与关键字匹配的链接,但如果它也匹配,则会覆盖现有的 href。我该如何改进它以忽略现有链接?

请不要使用 jQuery。

https://jsfiddle.net/o43Lxmtr/

最佳答案

您可以通过将否定集附加到正则表达式来修复它,以丢弃以 > 为前缀的单词并以 < 为后缀.

编辑:更好的方法可能是构建一个负前瞻,以禁止标签内包含文本。

再次编辑:如果负前瞻只对 anchor 标签有效,那就更好了:

var linkWord = function(obj){
  for(i in obj){  
    var x = document.body.innerHTML;   

    var linkStart = '<a href="'+obj[i]+'">';
    var linkEnd = '</a>';
    var reg = new RegExp("\\b(" + i + ")\\b(?![^<]*>|[^<>]*<\/[a])","ig"); 
    x = x.replace(reg, " " + linkStart + i + linkEnd + " ");
    document.body.innerHTML = x;
    console.log(document.body.innerHTML);
  }
  console.log(obj);
}

linkWord({
  'The':'http://www.example.com',
  'Vokalia':'http://icant.co.uk',
  'behind':'http://google.com', 
});

请注意,在替换字符串前后也添加了空格,因为正则表达式会去除它们。

编辑:工作演示 here .

Edit2:第二个解决方案的工作演示 here .

Edit3:第三个解决方案的工作演示 here .

关于Javascript 创建动态链接但忽略现有链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917311/

相关文章:

javascript - 如何让两层 Canvas 一层叠一层

javascript - 如果验证成功隐藏提交按钮并显示加载图像

javascript - 针对 Angular ng-show 和 ng-hide 的类

javascript - 选择特定目标 jQuery

javascript - bool 值 ("false") 返回 true.. 有其他选择吗?

javascript - 警报返回为未定义

javascript - 在 Meteor 服务器端代码中声明配置的位置

javascript - jQuery - 在所有 anchor 链接前放置一个自定义目录

javascript - 如何在矩形上画弧线?

javascript - 编写事件处理程序时对一些事情感到困惑