我正在尝试用“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字符串运行替换吗?
答案 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 */).
}
}
}