2010-11-27 39 views
5

我正在嘗試使用JavaScript &正則表達式將數字HTML實體替換爲其實際的Unicode字符,例如,使用JavaScript正則表達式將數字HTML實體替換爲其實際字符

foo's bar 
→ 
foo's bar 

這是我走到這一步:

"foo's bar".replace(/&#([^\s]*);/g, "$1"); // "foo39s bar" 

所有剩下要做的就是用String.fromCharCode($1)更換號碼,但我似乎無法得到它的工作。我怎樣才能做到這一點?

回答

8
"foo's bar".replace(/&#(\d+);/g, function(match, match2) {return String.fromCharCode(+match2);}) 
+0

這只是返回``foos bar「`。我錯過了什麼嗎?編輯:哦,顯然這是因爲`match` =`「'」`而不僅僅是`39`。 – alfonso 2010-11-27 15:23:17

+0

是的,你是正確的,我修復了代碼從此 – 2010-11-27 15:25:48

3
"foo's bar".replace(/&#([^\s]*);/g, function(x, y) { return String.fromCharCode(y) }) 

第一個參數(x)是在當前的例子中爲 「'」。 y是39.

0

如果你不想定義所有的實體,你可以讓瀏覽器爲你做 - 它創建一個空的p元素,寫入html並返回它產生的文本。 p元素永遠不會添加到文檔中。

function translateEntities(string){ 
    var text, p=document.createElement('p'); 
    p.innerHTML=string; 
    text= p.innerText || p.textContent; 
    p.innerHTML=''; 
    return text; 
} 
var s= 'foo's bar'; 
translateEntities(s); 

/* returned value: (String) 
foo's bar 
*/ 
3

除了使用一個回調函數,你可能要考慮爲十六進制字符引用添加支持(ሴ)。

此外,fromCharCode可能不夠。例如𐤀是對腓尼基字符的有效引用,但由於它位於基本多語言平面之外,並且JavaScript的字符串模型基於UTF-16代碼單元,而不是完整的字符代碼點,因此fromCharCode(67840)將不起作用。你需要一個UTF-16編碼器,例如:

String.fromCharCodePoint= function(/* codepoints */) { 
    var codeunits= []; 
    for (var i= 0; i<arguments.length; i++) { 
     var c= arguments[i]; 
     if (arguments[i]<0x10000) { 
      codeunits.push(arguments[i]); 
     } else if (arguments[i]<0x110000) { 
      c-= 0x10000; 
      codeunits.push((c>>10 & 0x3FF) + 0xD800); 
      codeunits.push((c&0x3FF) + 0xDC00); 
     } 
    } 
    return String.fromCharCode.apply(String, codeunits); 
}; 

function decodeCharacterReferences(s) { 
    return s.replace(/&#(\d+);/g, function(_, n) {; 
     return String.fromCharCodePoint(parseInt(n, 10)); 
    }).replace(/&#x([0-9a-f]+);/gi, function(_, n) { 
     return String.fromCharCodePoint(parseInt(n, 16)); 
    }); 
}; 

alert(decodeCharacterReferences('Hello &#x10900; mum &#67840;!'));