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

コールバック関数を使用するだけでなく、16 進文字参照 ( ) のサポートを追加することを検討することもできますሴ

また、fromCharCode物足りない場合があります。たとえば𐤀、フェニキア文字への有効な参照ですが、これは 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 &#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 に答える