JavaScript + Regex ::在整个文档中将“foo”替换为“bar”,不包括URL

时间:2017-01-14 01:25:20

标签: javascript regex dom

我正在尝试用“bar”替换页面上“foo”的所有实例,但要排除图像或URL链接中出现的实例。

我当前的代码是一个简单的替换:

bar
barbar
<a href="foo.com">bar</a>
<img src="foo.jpg">

但它会破坏地址中包含“foo”的图像和链接。

我正在寻找一个正则表达式替换,它将采用以下方法:

for {
    select {
    case msg := <-logCh:
        logque.Cache(msg)
    case <-time.After(time.Second):
    }
    if time.Since(lastFlush) >= 3 * time.Second {
        logque.Flush()
        lastFlush = time.Now()
    }
}

并告诉我:

if len(logch) >= LOG_CHANNEL_CAP {
    //drop the message or store it into
    //secondary buffer...
    return
}
logch <- msg

如果使用JavaScript中的regex无法实现这一点,那么只有更优雅的方式才能对非URL字符串运行替换吗?

2 个答案:

答案 0 :(得分:1)

有两个问题需要解决。

首先,您需要获取所有文本节点。这本身就是一个问题。

stackoverflow上的这个线程讨论了一些技术。

getElementsByTagName() equivalent for textNodes

一旦有了文本节点,就可以在每个节点上运行你的正则表达式,并且相当确定你得到了所有的东西。

答案 1 :(得分:1)

是的,你不打算用正则表达式做这件事。您要做的是替换DOM树中每个文本节点的文本。尝试这样的事情。

var allElements = document.getElementsByTagName("*"); // Get every element.

for (var i = 0; i < allElements.length; i++) { 
    var children = allElements.item(i).childNodes; 

    for (var j = 0; j < children.length; j++) { 
        if (children[j].nodeType === 3 /* is this node a text node? */) { 
            children[j].nodeValue = children[j].nodeValue.replace(/* run your replacement regex here */). 
        } 
    } 
}