javascript - 替换属性之间的文本

时间:2011-12-06 11:32:51

标签: javascript regex google-chrome-extension

我正在尝试用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");之后,我只想替换diva标记内的文字,避免使用<img alt=".."或{{1} }。

更多信息:

  1. href="...,因此元素未知。上面的例子只是一个例子。
  2. 非常欢迎正则表达式。
  3. html_str = document.body.innerHTML;hi值在可变内部,这意味着实际的替换是这样的:hello
  4. 真实代码是:

    html_str.replace(var1,var2);

    我希望我能很好地解释自己。 提前谢谢。

3 个答案:

答案 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');