2011-06-15 151 views
3

我有一个xml字典,如下所示。替换字符串 - 如何替换每个单词一次

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

Whenerver在词典中有一个单词在我的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); 
} 

但问题是 一次面包赢家修改链接的形式,也赢家变化,因为面包赢家包括赢家,赢家变化两次,所有的代码混合起来。

我在问有没有办法,一次面包赢家更改优胜者不应再改变。

在此先感谢!

回答

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 
} 
+0

这是比我的更好的解决方案 - 同样的想法,但更有效的实施 – kinakuta 2011-06-15 09:12:24

-1

尝试功能strtr($文本,$ fromlist里,$ toList)。它应该替换每个学期一次。

+0

这与问题无关。一个是PHP和两个,使用假设的JS“strtr”是非常不切实际的,因为问题是你想要搜索/替换的值在编译时是不知道的。 – Jon 2011-06-15 09:17:14

+0

不知道为什么我认为这是一个PHP问题。没问题,但 - 使用移植的JavaScript strtr函数[http://phpjs.org/functions/strtr:556](http://phpjs.org/functions/strtr:556)。 – Gedrox 2011-06-16 07:00:55

0

您需要某种类型的哨兵来防止处理已处理的术语。我建议用另一个元素包装替换的条款(不清楚你的html的结构,所以我不知道什么会在这里工作,但跨度将是在普通的HTML最简单的方式)。那么你的逻辑就会跳过替换那些有你决定包装它的父元素的单词。

0

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