2012-04-25 146 views
1

我想用javascript構建我自己的翻譯功能。 我已經有一個函數language.lookup(鍵),轉換一個字或詞:使用javascript正則表達式來翻譯html

var frenchHello = language.lookup('hello') //'bonjour' 

現在我想編寫一個函數,它接受一個HTML字符串和我的查找功能將其翻譯。在html字符串中,我將有一個特殊的語法,例如#[translationkey],它將指出這個詞應該被翻譯。

這是結果我想:

var html = '<div><span>#[hello]</span><span>#[sir]</span>' 
language.translate(html) //'<div><span>bonjour</span><span>monsieur</span> 

我怎麼會寫language.translate? 我的想法是用正則表達式過濾掉我的特殊語法,然後在每個鍵上運行language.lookup。也許用字符串替換什麼的。

當談到正則表達式,我只是想出了一個非常不完整的例子,但我總是把它包括在內,所以也許有人會想到我正在嘗試做什麼。然後,如果有更好的但完全不同的解決方案,那就更值得歡迎了。

var value = "#[hello], nice to see you."; 

lookup = function(word){ 
    return "bonjour"; 
}; 

var res = new RegExp("\\b(hello)\\b", "gi").exec(value) 

for (var c1 = 0; c1 < res.length; c1++){ 
    value = value.replace(res[c1], lookup(res[c1])) 
}  
alert(value) //#[bonjour], nice to see you. 

當然,正則表達式不應該過濾掉hello這個詞,而是過濾出語法,然後通過分組或類似的方式收集關鍵字。

任何人都可以幫忙嗎?

回答

2

只要使用String.replace方法的調用函數指定爲第二個參數,生成替換文本,使能力的全局替換使用正則表達式匹配你的語法:

var value = "#[hello], #[sir], nice to see you."; 

lookup = function(full_match, word){ 
    if(word == 'hello') 
     return "bonjour"; 
    if(word == 'sir') 
     return "monsieur" 
}; 

console.log(value.replace(/#\[(.+?)\]/gi, lookup)) 

結果: bonjour,monsieur,很高興見到你。

當然,當你替換列表變大了,你最好使用查找對象,而不是一系列的查找功能IFS的,但你真的可以做任何你想做那裏。

1

您可以使用類似:

#\\[[^\\]]*\\] 

,散列隨後左方括號後跟零個或多個字符不包括右方括號匹配,其次是一個封閉的方括號。

或者,在服務器端處理翻譯可能更好(甚至可能通過模板引擎),並將翻譯後的響應發回給客戶端。否則,(取決於您正在處理的具體問題),您最終可能會向瀏覽器發送大量數據,這可能會使您的應用程序響應速度變慢。

編輯: 這裏是工作一段代碼:「)主(」

var q="This #[ANIMAL1] was eaten by that #[ANIMAL2]"; 
    var u = {"#[ANIMAL1]":"Lion","#[ANIMAL2]":"Frog"}; 

    function insertAnimal(aString, lookup){ 
     var res = (new RegExp("#\\[[^\\]]*\\]", "gi"))   
     while (m = res.exec(aString)){ 
      aString = aString.replace(m, lookup[m]) 
     }  
     return aString; 
    } 

    function main(){ 
     alert(insertAnimal(q,u));   
    } 

可以調用從HTML文檔的身體onload事件

+0

是的,最好是做這個服務器端。否則你會讓客戶端加載兩種語言,一種將被替換。 – Spoike 2012-04-25 08:26:07

+0

您可以編輯完整的可運行示例的答案,因爲我無法使其與您的建議一起工作。 – John 2012-04-25 08:27:59

+0

人,用?修改。每次我看到「不包括」範圍,而不是簡單的節約調節劑,我的眼睛流血的疼痛。 – 2012-04-25 09:00:39

0

我可以比較你的要求,「解決內容中的模板文本「。如果使用Jquery是可行的,你應該嘗試Handlebars.js

1

你可以試試這個找到所有出現:

var re = new RegExp('#\\[([^\\]]+?)\\]', 'gi'), 
    str = '#[value1] plain text #[value2]', 
    match; 

while (match = re.exec(str)) { 
    console.log(match); 
} 
+0

我實際上在循環條件下第一次從re.exec(str)中獲得null。表達是否正確? – John 2012-04-25 08:44:16

+0

看起來問題出在'[\\]]'中,用'。'代替。 – lazyhammer 2012-04-25 08:48:36

+0

好吧,錯誤本地化和修復:)它括號內缺少'^' – lazyhammer 2012-04-25 08:53:03