【问题标题】:Search text using regex that ignore html tags使用忽略 html 标签的正则表达式搜索文本
【发布时间】:2016-09-23 08:02:59
【问题描述】:

我需要在搜索文本周围添加高亮类。但是其他的html标签挡住了我的路。这是一个例子:

开始于:

<div class="source">your <b><i>text</i></b> using <a href="#">regex ignoring html</a> tags</div>

然后我搜索:text using regex

预期结果(在本例中,我将使用span 突出显示):

<div class="source">your <b><i><span>text</span></i></b><span> using </span><a href="#"><span>regex</span> ignoring html</a> tags</div>

我对此有解决方案,但它需要特定的正则表达式来搜索忽略内部 html 标签的文本。 如果有下面提出的解决方案,我愿意提供建议。而且它不必用 vanilla js 编写。以下是我当前解决方案的简化版本,缺少提及的正则表达式。

由于缺少正则表达式,下面的示例不起作用

var source = document.querySelector('.source').innerHTML; // html from example
var text = 'text using regex'; // what we searching for
var htmlTag = new RegExp('(<\\/?([a-z]+)([^<]+)*(?:>))+', 'g'); // find html tags
var missingRegExp = new RegExp('', 'i'); // << missing regex

// Wrap searched text with span tag
var result = source.replace(missingRegExp, function (searchedText) {
  // Wrap html tags inside searched text with span tag
  searchedText = searchedText.replace(htmlTag, function (match) {
    return '</span>' + match + '<span>';
  });

  return '<span>' + searchedText + '</span>';
});

console.log('Result: ' + result);

在这种情况下,删除 html 标记不是一种选择。

【问题讨论】:

  • 不要重新发明轮子,试试mark.js
  • 改用var source = document.querySelector('.source').textContent
  • @dude 我会试试 mark.js。因为当我查看示例时,没有什么看起来像我的问题。但也许我需要调整一些选项。谢谢老兄。
  • @zer00ne 好的 textContent。但接下来呢?我需要从里面有标签。看例子。
  • .textContent 是没有标签的文本。不需要正则表达式,这是建议而不是答案,因此在 cmets 中而不是在答案中。

标签: javascript jquery html regex


【解决方案1】:

你有一个像text using regex 这样的字符串。您应该关心中间空格并用适当的正则表达式替换它们以匹配 HTML 标记,但首先您需要将每个单词括在括号中:

> '(' + "text using regex".split(' ').join(') (') + ')'
< "(text) (using) (regex)"

下一步是用正则表达式替换空格:((?:\s*(?:&lt;\/?\w[^&lt;&gt;]*&gt;)?\s*)*) 所以我们最后修改的版本应该是:

< "(text)((?:\s*(?:<\/?\w[^<>]*>)?\s*)*)(using)((?:\s*(?:<\/?\w[^<>]*>)?\s*)*)(regex)"

如果我们有 3 个单词要搜索,那么我们最终总共有 5 个捕获组(n 单词 -> n + n-1 捕获组),因此您应该基于它创建一个替换字符串。这里我们应该有我们的替换字符串:

<span>$1</span>$2<span>$3</span>$4<span>$5</span>

现在你有了编译好的正则表达式版本和替换字符串,.replace() 方法将成功地结束它们。

Live demo

【讨论】:

  • 需要改进。当您搜索单个单词或多个单词时(当空格是隐藏的 html 标签时),它工作得很好。但是,如果您搜索多个单词并且空格只是空格,那么它会失败。您需要将正则表达式更改为:(((?:\s*&lt;\/?\w[^&lt;&gt;]*&gt;\s*)*)|\s)。谢谢@revo。
  • innerHTML 上使用.replace 将破坏事件并触发DOM 的重新生成。同样,您不应重新反转轮子,而应使用现有的插件,如 mark.jshighlightRegex
  • 是的,没错,您不需要额外的替换。看我的更新。 @irek
  • 在使用document 对象时,您不必担心这一点。没有人在重新发明轮子。当只需要几行就可以完全完成一项任务时,你不应该那么懒惰地立即借用别人的作品,而这可能会提供比需要更多的功能。 @老兄
  • 无论如何我都会使用 jQuery 版本的 mark.js。 @老兄
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 2017-02-01
  • 1970-01-01
  • 2015-10-02
  • 2015-05-08
  • 2011-11-16
  • 2014-03-25
  • 1970-01-01
相关资源
最近更新 更多