当前位置: 首页 > 知识库问答 >
问题:

Javascript中的全词正则表达式匹配和超链接

艾令雪
2023-03-14

我需要一点正则表达式的帮助。

我使用Javascript和JQuery在HTML文档中链接术语,为此,我使用以下代码。我这样做是为了在一份庞大的文件中提供一些术语。

var searchterm = "Water";

jQuery('#content p').each(function() {

  var content = jQuery(this),
      txt = content.html(),
      found = content.find(searchterm).length,
      regex = new RegExp('(' + searchterm + ')(?![^(<a.*?>).]*?<\/a>)','gi');

  if (found != -1) {
    //hyperlink the search term
    txt = txt.replace(regex, '<a href="/somelink">$1</a>');
    content.html(txt);
  }
});

然而,有一些情况我不想匹配,由于时间限制和大脑融化,我伸出一些援助。

编辑:我根据@ggorlen提供的优秀示例更新了下面的代码,谢谢!

示例 https://codepen.io/julian-young/pen/KKwyZMr

共有1个答案

郁鸿博
2023-03-14

将整个DOM转储为原始文本并使用正则表达式对其进行解析规避了jQuery(以及JS,通过扩展)的主要目的,即将DOM作为节点的抽象树进行遍历和操作。

文本节点有一个nodeType节点。TEXT_NODE,我们可以在遍历中使用它来标识您感兴趣的非链接节点。

获得文本节点后,可以适当地应用正则表达式(解析文本,而不是HTML)。我使用了

jQuery 为您提供了一个 replaceWith 方法,该方法在您进行所需的正则表达式替换后替换节点的内容。

$('#content li').contents().each(function () {
  if (this.nodeType === Node.TEXT_NODE) {    
    var pattern = /(\b[Ww]aters?(?!-)\b)/g;
    var replacement = '<mark>$1</mark>';
    $(this).replaceWith(this.nodeValue.replace(pattern, replacement));
  }
});
html lang-html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Example Content</h1>
<div id="content">
  <ul>
    <li>Water is a fascinating subject. - <strong>match</strong></li>
    <li>We all love water. - <strong>match</strong></li>
    <li>ice; water; steam - <strong>match</strong></li>
    <li>The beautiful waters of the world - <strong>match</strong> (including the s)</li>
    <li>and all other water-related subjects - <strong>no match</strong></li>
    <li>and this watery topic of - <strong>no match</strong></li>
    <li>of WaterStewardship looks at how best - <strong>no match</strong></li>
    <li>On the topic of <a href="/governance">water governance</a> - <strong>no match</strong></li>
    <li>and other <a href="/water">water</a> related things - <strong>no match</strong></li>
    <li>the best of <a href="/allthingswater">all things water</a> - <strong>no match</strong></li>
  </ul>
</div>

 类似资料:
  • Perl6正则表达式匹配连接 它为False,因为连词中的“23”与$a中的“23”子字符串匹配,但此子字符串与连词中的“ef”不匹配。这有点违反直觉,因为它更容易解释$a ~~ m/23 如果我有n个正则表达式,我想看看是否所有这些n个正则表达式都匹配相同的整个字符串,而不是匹配整个字符串的相同子字符串部分,那么编写perl6表达式的最佳方法是什么? 在例子中,我真的想做 如果正则表达式的数量很

  • 问题内容: 设置修饰符后,为什么Java子匹配项停止工作? 上面的方法很好,is 和is 。 上面的内容忽略了我的捕获组。以下是唯一有效的解决方案吗? 编辑: 我再次高兴地告诉您,十年后您现在可以执行此操作(.matchAll已添加到规范中) 问题答案: 我很惊讶地发现我是第一个回答我十年前一直在寻找答案的人(答案尚不存在)。我还希望实际的规范作者会在我之前回答它;)。 .matchAll 已被添

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我们得到了一些这样的内容:

  • 给定下面的字符串 [NeMo(PROD)]10.10.100.100(EFA-B-3)[博科FC-Switch]传感器:电源#1(SNMP自定义表)关闭(无此名称(SNMP错误#2)) 我尝试获取多个匹配项以提取以下值: 因为我是正则表达式的初学者,所以我试图定义一些“规则”: 提取第一个圆括号内的第一个值,例如PROD 提取第一个闭合方括号和第二个开口圆括号之间的值,例如10.10.100.10

  • 问题内容: 我在为以下情况找到正确的正则表达式时遇到了麻烦: 可以说: 我想匹配整个单词-例如应该返回,因为这不是一个单词,并且应该返回,因为在左右两侧都没有字母字符。 问题答案: 尝试 从文档: 匹配空字符串,但仅匹配单词的开头或结尾。 请注意,该模块使用的简单定义作为“字母数字或下划线字符的序列”,其中“字母数字”取决于语言环境或选项。 另请注意,如果没有原始字符串前缀,则被视为“退格”,而不