当前位置: 首页 > 面试题库 >

使用正则表达式和JavaScript突出显示html中的单词-几乎存在

吕鹏
2023-03-14
问题内容

我正在编写一个jquery插件,它将执行浏览器样式的页面查找。我需要改善搜索,但现在还不想解析html。

目前,我的方法是获取整个DOM元素和所有嵌套的元素,并为给定术语简单地运行正则表达式查找/替换。在替换中,我将简单地在匹配词条周围包裹一个跨度,并以该跨度为锚点来进行突出显示,滚动等操作。
至关重要的是,任何html标签内的字符都不得匹配。

这与我所获得的接近:

(?<=^|>)([^><].*?)(?=<|$)

捕获所有 不在 html标记中的字符都做得很好,但是我在弄清楚如何插入搜索词时遇到了麻烦。

Input: Any html element (this could be quite large, eg <body>)    
Search Term: 1 or more characters    
Replace Txt: <span class='highlight'>$1</span>

更新

当我使用进行测试时,以下正则表达式可以实现我想要的…

Regex: (?<=^|>)(.*?)(SEARCH_STRING)(?=.*?<|$)
Replacement: $1<span class='highlight'>$2</span>

但是我在JavaScript中使用它时遇到了一些麻烦。使用以下代码,chrome给了我错误“无效的正则表达式:/(?<= ^ |>)(。
?)(Mary)(?=。 ?<| $)/:无效的组”。

var origText = $('#'+opt.targetElements).data('origText');
var regx = new RegExp("(?<=^|>)(.*?)(" + $this.val() + ")(?=.*?<|$)", 'gi');
$('#'+opt.targetElements).each(function() {
   var text = origText.replace(regx, '$1<span class="' + opt.resultClass + '">$2</span>');
   $(this).html(text);
});

在组(?<= ^ |>)上很麻烦-这是笨拙的还是Regex引擎中的差异?

更新

此正则表达式在该组上中断的原因是因为Javascript不支持正则表达式后向。有关参考和可能的解决方案


问题答案:

只需使用jQuerys内置text()方法。它将返回所选DOM元素中的所有字符。

对于DOM方法针对Node接口的文档:在元素的所有子节点上运行。如果子节点是元素节点,则以递归方式运行。如果是文本节点,请搜索文本(node.data),如果要突出显示/更改某些内容,请将该节点的文本缩短到找到的位置,然后插入带有匹配文本的highligth-
span,其余部分插入另一个文本节点的文字。

(function iterate_node(node) {
    if (node.nodeType === 3) { // Node.TEXT_NODE
        var text = node.data,
            pos = text.search(/any regular expression/g), //indexOf also applicable
            length = 5; // or whatever you found
        if (pos > -1) {
            node.data = text.substr(0, pos); // split into a part before...
            var rest = document.createTextNode(text.substr(pos+length)); // a part after
            var highlight = document.createElement("span"); // and a part between
            highlight.className = "highlight";
            highlight.appendChild(document.createTextNode(text.substr(pos, length)));
            node.parentNode.insertBefore(rest, node.nextSibling); // insert after
            node.parentNode.insertBefore(highlight, node.nextSibling);
            iterate_node(rest); // maybe there are more matches
        }
    } else if (node.nodeType === 1) { // Node.ELEMENT_NODE
        for (var i = 0; i < node.childNodes.length; i++) {
            iterate_node(node.childNodes[i]); // run recursive on DOM
        }
    }
})(content); // any dom node


 类似资料:
  • 问题内容: 我想知道是否可以用颜色突出显示与某些字符串匹配的shell命令的输出。 例如,如果我运行myCommand,则输出如下: 我希望所有匹配^ ERROR \ s。*的行都突出显示为红色。 同样,我希望将相同的突出显示应用于grep的输出,更少等等。 编辑:我可能应该提到,理想情况下,我想通过.bashrc中的“配置文件”选项来全局启用此功能。 问题答案: 如果要全局启用此功能,则需要终端

  • 我正在尝试抓取模式中第一个连字符之后的文本 但在此模式中: 我希望它跳过‘不想要的’文本,并匹配的文本后面的下一个连字符(DesiredText)。我创建了一个具有两种模式regex101,并需要修改我的基本regex,以便如果中存在一个或多个我不想匹配的单词,那么它将匹配第二个连字符文本: https://regex101.com/r/vesqh3/1

  • 我想验证输入的代码是否是HTML代码(必须以<代码> 我试着这么做 但是我有一个问题需要在代码中做一个\n,我需要验证第一个和结束标签(=

  • 问题内容: 我想在Elastisearch中使用单词边界进行正则表达式查询,但是看起来Lucene正则表达式引擎不支持。我可以使用哪些解决方法? 问题答案: 在ElasticSearch regex风格中,没有直接等效于单词边界的功能。最初是一样的东西,如果用一个字字符开始,并且尾部就像如果用一个字字符结束。 因此,我们需要确保在字符串的前后或字符串的开始/结束处有一个非单词char 。由于正则表

  • 假设我有以下字符串 在所有应用程序上使用regex,是否有可能 i、 e.替换包含单词的模式的正则表达式,例如,从上面的被

  • 我正在使用以下正则表达式: 我的目标是只验证数字(int和decimal),空格, ( ), 点,AND,OR。其他一切都是不允许的。它看起来像是工作的,但是我对单词边界\bAND\b和\bOR\b Eg有问题。我不能输入ANDWE或EEE或任何组合,但我能做的是AN或A。如何在字符串中只允许两个单词AND或OR?它们在字符串中是可选的。 输入示例 0.10和23-有效 12和(15或0.2)-有