为了账号安全,请及时绑定邮箱和手机立即绑定

JS-查找字符串的所有实例并包装在定位标记中

JS-查找字符串的所有实例并包装在定位标记中

天涯尽头无女友 2021-04-28 13:25:54
我试图找出是否有可能用锚标记包装字符串的所有实例。基本上,我们想在我们的网站上找到myBrand或的任何实例,myBrand.com并将它们包装在锚点中,例如<a href="/">myBrand</a>或<a href="/">myBrand.com</a>。但是,无论它们在我页面的各个元素中的埋深有多深,我都希望能够找到此实例的所有实例,并查看它们是否已链接,这就是我遇到的问题。编辑我已将代码段编辑为现在的内容,但仍然遇到困难:document.querySelectorAll('body').forEach(function(el){  var text = el.innerHTML.match(/myBrand/g);    console.log(text.parentElement); // how do i get the parent?    if(isAnchor(text.parentElement)){    //  }else{      var newtext = el.innerHTML.replace(/myBrand/g, '<a href="/">myBrand</a>');    el.innerHTML = newtext;  }});function isAnchor(str){    return /^\<a.*\>.*\<\/a\>/i.test(str);}<body>myBrand<h1>myBrand.com</h1><p>This is a div that mentions myBrand</p><table><thead>    <tr>    <td>This is myBrand's table header</td>    </tr></thead><tbody>  <tr>  <td>myBrand.com</td>  </tr></tbody></table><a href="/">myBrand.com</a></body>
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以为此使用XPath:


function textContaining(phrase) {

  return document.evaluate(

    "//text()[contains(., '" + phrase + "')]",

    document,

    null,

    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,

    null

  )

}

然后,您可以像这样遍历结果:


var result = textContaining(phrase)

for (var i = 0; i < result.snapshotLength; ++i) {

  var originalNode = result.snapshotItem(i)

  // ...

}

一旦获得了匹配#text节点的列表,您只需要过滤掉任何.parentElement是<a>标签的节点即可。


另外,您可以使用jQuery.parents()函数检查父母的父母,以便解决诸如之类的情况<a><span>sometext</span></a>,而不仅仅是直接子女的情况。


查看完整回答
反对 回复 2021-05-20
  • 3 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信