【问题标题】:Search a string but ignore tag [duplicate]搜索字符串但忽略标签[重复]
【发布时间】:2016-10-28 15:54:04
【问题描述】:

我正在尝试搜索字符串的出现,但如果它们是锚标记的一部分,则不想匹配它们。

var str = 'hey there. <a href="github.com">github.com/bvaughn</a>';
str.match(/git/gi)

上面的代码匹配了 git inside href 和锚标签的 innerHTML。我想忽略第一场比赛。忽略打开和关闭选项卡,但仍搜索 innerHTML。

这可以通过修改正则表达式来完成吗?我已经尝试了几种组合,但我只是没有得到正确的结果。

更新

让我解释一下我的实际用例。我正在尝试创建类似于 chrome 中内置搜索的搜索界面,我们在其中突出显示页面中出现的文本。为此,我使用了一个反应组件 - react-highlight-words。这对于普通文本非常有效,但我想在突出显示它们之前自动链接文本中的 url。

在文本中包含标记并将其传递给上述组件会弄乱标记,因为它也匹配其中的字符。所以我希望它忽略锚标记的开始和结束标记,但考虑其余部分。

This is where the relevant matching happens. 我希望我能以某种方式调整正则表达式以忽略锚标记。

【问题讨论】:

  • 用 reg exp 匹配 html 是个坏主意
  • 为什么不将该字符串指定为元素的innerHTML 并在元素中搜索文本而不是字符串?是的,在一些极端情况和限制条件下可能是可能的,但为什么要花这么多时间来做一些原本如此简单的事情呢?
  • str.replace(/&lt;[^&gt;]*&gt;/g,"").match(/git/gi)
  • 我添加了一个删除整个 &lt;a href=""&gt;&lt;/a&gt; 元素的答案,而不仅仅是 HTML 标签

标签: javascript regex


【解决方案1】:

试试这个正则表达式:

var str = 'hey there. <a href="github.com">github.com/bvaughn</a>';
str = str.replace(/<.*>(.*)<\/.*>/g, "$1")
console.log(str);
str.match(/git/gi)
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

    【解决方案2】:

    老实说,我对问题和答案感到恼火。这个话题在 SO 上已经讨论了几十次了。

    首先,您应该使用 mike510a 的答案。 JuniorNunes7 的答案只应在您的内容不在 DOM 中的情况下使用。原因如下:

    • innerHTML 会破坏事件!
    • innerHTML 将触发 DOM 的重新生成!

    为了避免这种情况,您需要修改文本节点本身。但是,不是重新反转轮子here's,而是使用 jQuery 比较文本荧光笔插件。唯一使用纯 JavaScript 的是mark.js。由于您使用的是 React,我建议您使用它。

    您的情况示例:

    new Mark(document.querySelector(".context")).mark("git");
    <script src="https://cdn.jsdelivr.net/mark.js/8.4.0/mark.min.js"></script>
    <div class="context">
      hey there. <a href="github.com">github.com/bvaughn</a>
    </div>

    您的界面可以查看this example

    它还可以选择忽略特定元素内的匹配项,例如链接。

    【讨论】:

    • 迄今为止最糟糕的答案——你已经添加了一个完整的额外javascript代码库来完成这样一个只需要一两行代码的简单事情。修改 DOM 没有任何问题——这就是 Javascript 的基本设计目的。很好的答案 - 从长远来看可能会少很多工作..
    • 我不同意。如果您正确实施它,它将需要更多代码。您必须遍历文本节点、查找匹配项、拆分下一个节点、插入新创建的 &lt;mark&gt; 元素。由于他不想建立搜索,他还需要一种方法来删除高光——另一种方法是必要的。事实上,你很快就会意识到这就是 mark.js 所做的,没有理由重新反转整个轮子。
    • 编辑后,现在你是对的 - 用例实际上不在最初的问题上 - 最有可能正确实现这样的事情需要更多的工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2018-09-13
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多