Javascript 将正则表达式限制为仅包含非html文本

Javascript 将正则表达式限制为仅包含非html文本,javascript,html,regex,Javascript,Html,Regex,我找到了这个javascript函数,它替换字符串中的所有事件。它工作得很好,但我需要它只适用于非html元素,这意味着字符串中不在“”之间的任何部分 我希望这样做,因为“strReplace”字符串有时出现在html中,因此会弄乱html输出。感谢您的帮助:)假设您想用replaceAll方法替换一个字符串: 如果一个字符串不是一个有效的html,则将其视为纯文本 如果一个字符串是一个有效的html,则循环每个文本内容以应用replaceAll 解决方案(使用element.innerHTML

我找到了这个javascript函数,它替换字符串中的所有事件。它工作得很好,但我需要它只适用于非html元素,这意味着字符串中不在“”之间的任何部分


我希望这样做,因为“strReplace”字符串有时出现在html中,因此会弄乱html输出。感谢您的帮助:)

假设您想用
replaceAll
方法替换一个字符串:

  • 如果一个字符串不是一个有效的html,则将其视为纯文本

  • 如果一个字符串是一个有效的html,则循环每个文本内容以应用
    replaceAll

  • 解决方案(使用element.innerHTML而不是regex表达式,正如@epascarello所说,使用regex匹配html不是一个好主意):

  • 使用
    .innerHTML

  • 循环此元素以获取所有文本节点

  • 对文本节点的内容应用
    replaceAll

  • 返回
    el.innerHTML

  • String.prototype.replaceAll=函数(strReplace,strWith){
    //看http://stackoverflow.com/a/3561711/556609
    var esc=strReplace.replace(/[-\/\\^$*+.()|[\]{}]/g,\\$&');
    var reg=新的RegExp(esc,'ig');
    返回此项。替换(reg,strWith);
    }
    函数replaceAll2(targetString、关键字、replaceWord){
    如果(!关键字)返回targetString
    设el=document.createElement('div'))
    el.style.display='none'
    el.innerHTML=targetString
    let walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false)
    let next=walk.nextNode()
    while(下一个){
    next.textContent=next.textContent.replaceAll(关键字,replaceWord)
    next=walk.nextNode()
    }
    返回el.innerHTML
    }
    让test1='我是纯文本'
    让test2='我是一个普通的文本'
    log(replaceAll2(test1,'pl','1'))
    
    log(replaceAll2(test2,'pl',2'))
    一个问题:
    Test
    将被视为一个单词(
    =Test
    )或不被视为一个单词?将html与reg exp匹配是一个坏主意……@Sphinx最好将其视为单词“Test”是,但如果这让事情变得比我想象的更复杂的话,我会非常高兴能得到一个解决方案,并以其他方式加以处理way@epascarello我听说过,但我不知道如何以其他方式执行此任务。如果是这样,可以先获取一个dom元素的所有文本节点,然后使用一个循环来替换每个文本节点的所有文本节点。如果您不关心保留原始html标记,您可以通过
    元素将元素转换为纯文本。innerText
    ,然后应用
    replaceAll
    谢谢,这正是我想要的!但是,我现在确实有一个小问题,就是在用html内容替换目标单词时,我假设是由于“next.textContent”行。如果用
    html内容替换关键字
    ,标记将被转义。也许这就是你提到的问题。如果
    html内容
    ,您可能需要将
    replaceWord
    解析为dom元素,然后使用
    element.insertBefore
    而不是
    String.replace
    。我想,我通过使用第一个replace函数在之后应用html成功地解决了这个问题。再次感谢,我真的很感激!
    String.prototype.replaceAll = function (strReplace, strWith) {
        // See http://stackoverflow.com/a/3561711/556609
        var esc = strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
        var reg = new RegExp(esc, 'ig');
        return this.replace(reg, strWith);
    };