我正在尝试用Javascript替换HTML字符串中的文本。 棘手的部分是,只有当文本不在标签内时才需要替换文本(意味着它不属于属性):
var html_str = '<div>hi blah blah<img src="img.jpg" alt="say hi" /><a href="link_hi.php">hi!</a></div>';
在此示例中,在我执行html_str.replace("hi","hello");
之后,我只想替换div
和a
标记内的文字,避免使用<img alt=".."
或{{1} }。
更多信息:
href="...
,因此元素未知。上面的例子只是一个例子。html_str = document.body.innerHTML;
和hi
值在可变内部,这意味着实际的替换是这样的:hello
真实代码是:
html_str.replace(var1,var2);
我希望我能很好地解释自己。 提前谢谢。
答案 0 :(得分:3)
这可能吗?
var obj = {'hi':'hello','o':'*','e':'3','ht':'HT','javascrpit':'js','ask':'ASK','welcome':'what\'s up'}; // This may contain a lot more data
(function helper(parent, replacements) {
[].slice.call(parent.childNodes, 0).forEach(function (child) {
if (child.nodeType == Node.TEXT_NODE) {
for (var from in replacements) {
child.nodeValue = child.nodeValue.replace(from, replacements[from]);
}
}
else {
helper(child, replacements);
}
});
}(document.body, obj));
http://jsfiddle.net/G8fYq/4/(直接使用document.body )
如果您想立即看到更改,那么您也可以通过document.body
并忘记整个container
内容。
更新以允许在一次运行中进行多次替换。
您也可以在javascript中尝试 XPath ,但以下解决方案在IE中无效。
var
replacements = {'hi':'hello','o':'*','e':'3','ht':'HT','javascrpit':'js','ask':'ASK','welcome':'what\'s up'},
elements = document.evaluate('//text()', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
i = 0,
textNode, from;
for (; i < elements.snapshotLength; i += 1) {
textNode = elements.snapshotItem(i);
for (from in replacements) {
if (replacements.hasOwnProperty(from)) {
textNode.nodeValue = textNode.nodeValue.replace(from, replacements[from]);
}
}
}
答案 1 :(得分:1)
实际上可以使用这个简单的正则表达式负向前瞻:
(?![^<>]*>)
只需将其添加到匹配模式中,它就会将任何内容排除为标记中的属性。这是一个例子: Javascript regex: Find all URLs outside <a> tags - Nested Tags
答案 2 :(得分:-1)
您可以试试这个,但正则表达式和HTML不是朋友:
var str = '<div>hi blah blah<img src="img.jpg" alt="say hi" /><a href="link_hi.php">hi!</a></div>',
rx = new RegExp('(\>[^\>]*)' + 'hi' + '([^\>=]*\<)', 'g');
str = str.replace(rx, '$1hello$2');