2011-12-06 51 views
0

我试图用Javascript替换HTML字符串中的文本。 最棘手的部分是,我需要替换的文字,只有当它是不是一个标签内(即它不是一个属性的一部分):javascript - 替换属性之间的文本

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");后,我想更换只有diva标签内的文字,避免<img alt=".."href="...

一些更多的信息:

  1. html_str = document.body.innerHTML;,因此元素是未知的。上面的例子只是一个例子。
  2. 正则表达式比欢迎。
  3. hihello值都在里面varaibles,这意味着实际取而代之的是像这样:html_str.replace(var1,var2);

真正的代码是这样的:

var html_str = document.body.innerHTML; 
var replaced_txt = "hi"; 
var replace_with = "hello"; 
var replaced_html = html_str.replace(replaced_txt,replace_with); 

我希望我解释自己很好。 在此先感谢。

回答

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东西。

更新以允许在一次运行中进行多次替换。


您也可以尝试的XPath在JavaScript中,虽然下面的解决方案将无法在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]); 
    } 
    } 
} 
+0

没有帮助我的情况。谢谢你,虽然... – Phoenix

+0

@Phoenix出于好奇,为什么不呢? – Yoshi

+0

它只是没有工作。其实我希望这个解决方案能够工作,它能更好地适应我的代码。我需要对HTML文本进行更改,而不会对标记造成任何“损害”,而这通常会发生在正则表达式中。 – Phoenix

-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'); 
+0

谢谢。我需要在'>'之前删除'\',但对我而言效果很好。 – Phoenix