我正在尝试使用JavaScript&正则表达式用实际的Unicode字符替换数字HTML实体,例如
foo's bar
→
foo's bar
这是我到目前为止所得到的:
"foo's bar".replace(/&#([^\s]*);/g, "$1"); // "foo39s bar"
剩下要做的就是用String.fromCharCode($1)
替换号码,但我似乎无法让它发挥作用。我怎么能这样做?
答案 0 :(得分:10)
"foo's bar".replace(/&#(\d+);/g, function(match, match2) {return String.fromCharCode(+match2);})
答案 1 :(得分:3)
"foo's bar".replace(/&#([^\s]*);/g, function(x, y) { return String.fromCharCode(y) })
第一个参数(x)在当前示例中是“'”。 y是39。
答案 2 :(得分:3)
除了使用回调函数之外,您可能还需要考虑添加对十六进制字符引用的支持(ሴ
)。
此外,fromCharCode
可能还不够。例如𐤀
是对Phoenician字符的有效引用,但因为它在Basic Multilingual Plane之外,并且JavaScript的String模型基于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 𐤀 mum 𐤀!'));
答案 3 :(得分: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
*/