仅替换具有类突出显示 javascript 的子字符串

Posted

技术标签:

【中文标题】仅替换具有类突出显示 javascript 的子字符串【英文标题】:replace only sub string which has class highlight javascript 【发布时间】:2015-07-25 18:00:30 【问题描述】:

我有以下代码:

document.getElementById("rep").innerhtml = document.getElementById("rep").innerHTML.replace(rxp, "abc");
<div id="rep"> asd 123 asd <span class="light">123</span> asd 123 asd <span class="light">123</span> </div>

这里,rxp 是一个匹配数字的正则表达式。 问题是我只想替换那些未包含在span 中的123,而不是替换包含在<span class="light"> 中的123

【问题讨论】:

【参考方案1】:

您可以使用reverse string trick 来利用负前瞻而不是负后瞻(javascript 正则表达式引擎不支持):

function revStr(str) 
    return str.split('').reverse().join('');


var rxp = new RegExp("[0-9]+(?:\\.[0-9]+)?(?![^>]*>\"thgil\"=ssalc\\s+naps<)", "gm");
var str = '<div id="rep"> asd 123 asd <span class="light">123</span> asd 123 asd <span class="light">123</span> </div>';
var result = revStr(revStr(str).replace(rxp, revStr('abc')));
document.getElementById("res").value = result;
&lt;input id="res"/&gt;

您还应该使用反向替换字符串。

编辑:如果您需要检查数字是否未包含在 any &lt;span&gt; 标记中带有任何属性,您可以使用更简单的正则表达式:

var rxp = new RegExp("[0-9]+(?:\\.[0-9]+)?(?![^>]*>[^>]*\\bnaps<)", "gm");

【讨论】:

如果数字的正则表达式是这样的: var rxp = new RegExp("(([0-9]+\.?[0-9]+)|([0-9 ]+))", "gm"); 我没有看到任何问题,因为您只匹配数字和数字之间的可选点:var rxp = new RegExp("[0-9]+(?:\\.[0-9]+)?(?![^&gt;]*&gt;\"thgil\"=ssalc\\s+naps&lt;)", "gm");编辑:我删除了\b字边界,也许,即使是xxx123,你也需要删除数字。 这是一个非常有创意的解决方案 @stribizhev 谢谢..! @stribizhev 我有一个小问题,如果跨度类不轻,我的意思是如果它会是我不知道的东西,那么正则表达式会是什么?

以上是关于仅替换具有类突出显示 javascript 的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

突出显示文本区域内的文本

给定具有多个边界框的图像,如何仅突出显示完全在另一个边界框内的那些边界框?

突出显示 OBIEE 或 SQL 中父值的子值差异

使用 JavaScript,如何在具有多个值的日期列的表中突出显示“今天”的每个日期

使用 Javascript 突出显示页面上的文本

jquery 仅显示具有相同类的下一个 div