替换字符串 - 如何替换每个单词一次

时间:2011-06-15 09:01:38

标签: javascript string

我有一个xml字典,如下所示。

<word definition="The primary income-earner in a household">bread winner</word>
<word definition="One who wins, or gains by success in competition, contest, or gaming">winner</word>

当我的html中的字典中有一个单词时,该单词将被替换为链接和定义作为标题。当链接悬停时,用户应该看到定义。

var allwords = xmlDoc.getElementsByTagName("word");
for (var i=0; i<allwords.length; i++)
    {
            var name = allwords[i].lastChild.nodeValue;

            var linked = '<a href ="#" title="' +  allwords[i].lastChild.nodeValue + ': ' + allwords[i].getAttribute("definition") + '">' + allwords[i].lastChild.nodeValue + '</a>'; 
    }

这是我的替换者

function replacer(oldstring, newstring) {
document.body.innerHTML = document.body.innerHTML.replace(oldstring, newstring);
}

但问题是 一旦面包获胜者更改为关联表单,获胜者更改,因为面包获胜者包括获胜者,获胜者更改两次,以及所有代码混合起来。

我问是否有办法,一旦面包获胜者更改获胜者不再更改。

提前致谢!

4 个答案:

答案 0 :(得分:2)

这样的事情:

for (var i=0; i<allwords.length; i++)
{
    if(allwords[i].firstChild.name == 'a') {
        // This word has been linked already, skip it
    }

    // your code
}

答案 1 :(得分:0)

您需要某种哨兵来防止处理已经处理的术语。我建议用另一个元素包装替换的术语(不清楚你的html是如何构造的,所以我不确定这里有什么用,但是跨度将是普通html中最简单的方法)。然后你的逻辑就会跳过替换那些包含你决定用它包装的父元素的单词。

答案 2 :(得分:0)

您需要遍历匹配的文本节点,并且只将那些没有A标记的节点替换为DOM中的祖先。

答案 3 :(得分:-1)

尝试函数strtr($ text,$ fromList,$ toList)。它应该替换每个术语一次。