6

我正在尝试使用 JavaScript 和正则表达式将数字 HTML 实体替换为其实际的 Unicode 字符,例如

foo's bar
→
foo's bar

这是我到目前为止得到的:

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

剩下要做的就是用 替换数字String.fromCharCode($1),但我似乎无法让它工作。我怎样才能做到这一点?

4

4 回答 4

10
"foo's bar".replace(/&#(\d+);/g, function(match, match2) {return String.fromCharCode(+match2);})
于 2010-11-27T15:21:10.657 回答
3
"foo's bar".replace(/&#([^\s]*);/g, function(x, y) { return String.fromCharCode(y) })

在当前示例中,第一个参数 (x) 是“'”。y 是 39。

于 2010-11-27T15:27:00.587 回答
3

除了使用回调函数外,您可能还需要考虑添加对十六进制字符引用 ( ሴ) 的支持。

另外,fromCharCode可能还不够。eg𐤀是对腓尼基字符的有效引用,但由于它在基本多语言平面之外,并且 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;!'));
于 2010-11-27T16:01:25.390 回答
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&#39;s bar';
translateEntities(s);

/*  returned value: (String)
foo's bar
*/
于 2010-11-27T15:44:17.647 回答