2010-11-27 18 views
5

Sayısal HTML öğelerini gerçek Unicode karakterleriyle değiştirmek için JavaScript & düzenli ifadesini kullanmaya çalışıyorum.Sayısal HTML öğelerini gerçek karakterleriyle değiştirmek için JavaScript regex kullanın

foo's bar 
→ 
foo's bar 

Bu defa ne var: Bütün bunlar yapmak kaldı

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

String.fromCharCode($1) ile numarayı yerini alacak, ancak çalışması için görünmektedir olamaz. Bunu nasıl yapabilirim?

cevap

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

Bu sadece "foos çubuğu" değerini döndürür. Bir şey mi eksik? Düzenleme: Oh, görünüşe göre bu, 'match' =' '' '' ve sadece '39' değil. – alfonso

+0

evet doğru, o zamandan beri kodu tamir ettim –

+0

Teşekkürler, işe yarıyor! Cevabınızı 5 dakika içinde kabul edeceğim. – alfonso

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

Birinci parametre (x) mevcut örnekte bir "'" dir. y 39.

0

Tüm varlıkları tanımlamak istemezseniz, tarayıcının sizin için yapmasına izin verebilirsiniz - bu bit boş bir p öğesi oluşturur, html yazar ve oluşturduğu metni döndürür. P elemanı belgeye asla eklenmez.

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 
*/ 
+0

Lütfen bunu yapma. Yerleşik HTML ayrıştırıcı, keyfi içeriklere güvenmek için çok fazla yetkiye sahiptir. Bu sadece XSS'in gerçekleşmesini bekliyor. Script elemanları 'innerHTML 'ayarının bir sonucu olarak çalıştırılmasa da, bu sadece bir vektördür. Kod yürütmesine neden olabilecek veya isteğe bağlı ağ isteklerine izin verebilecek bir kaçını isimlendirmek için başkaları (CSS 'expression',' onerror' işleyicileri, nesne ve yerleştirme öğeleri, katıştırılmış XML ve harici varlıklar) vardır. –

3

yanı bir geri arama işlevini kullanarak gibi, sen altıgen karakter başvuruları için ilave destek (ሴ) düşünebilir.

Ayrıca, fromCharCode yeterli olmayabilir. Örneğin, 𐤀 bir Fenike karakteri için geçerli bir referanstır, ancak Temel Çok Dilli Düzlem'in dışında olduğu ve JavaScript'in String modeli UTF-16 kod birimlerine dayalı olduğundan, karakter kod noktalarını tam olarak değil, fromCharCode(67840) çalışmayacaktır. Bir UTF-16 kodlayıcısına ihtiyacınız vardır, örneğin:

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;!')); 
İlgili konular