2011-06-15 189 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中的祖先。