Javascript'te html varlıklarını kodlayın


100

Kullanıcıların içerik girmesine izin veren bir CMS'de çalışıyorum. Sorun, semboller eklediklerinde ®tüm tarayıcılarda iyi görüntülenmeyebilmesidir. Aranması ve ardından karşılık gelen html varlığına dönüştürülmesi gereken sembollerin bir listesini oluşturmak istiyorum. Örneğin

® => ®
& => &
© => ©
™ =>™

Dönüşümden sonra, bir <sup>etikete sarılması gerekir, bu da şuna neden olur:

® => <sup>&reg;</sup>

Belirli bir yazı tipi boyutu ve dolgu stili gerekli olduğundan:

sup { font-size: 0.6em; padding-top: 0.2em; }

JavaScript böyle bir şey olur mu?

var regs = document.querySelectorAll('®');
  for ( var i = 0, l = imgs.length; i < l; ++i ) {
  var [?] = regs[i];
  var [?] = document.createElement('sup');
  img.parentNode.insertBefore([?]);
  div.appendChild([?]);
}

"[?]" Emin olmadığım bir şey olduğu anlamına gelir.

Ek detaylar:

  • Bunu saf JavaScript ile yapmak istiyorum, jQuery gibi bir kitaplık gerektiren bir şey değil, teşekkürler.
  • Arka uç Ruby'dir
  • Ruby on Rails ile oluşturulan RefineryCMS'yi kullanma

Arka ucunuz nedir? Eğer php ise, bunu sizin için halledecek işlevler vardır ve eminim diğer dillerde de vardır. Ayrıca, Google: developmentwithstyle.com/articles/2010/06/29/…
Chris Baker

5
UTF-8 kodlu metni kabul etmek ve çıktı almak daha iyi bir çözüm olabilir. Bugün kullanılan her tarayıcı UTF-8'i desteklemektedir. HTML tarafında, eklemek istiyoruz accept-charset="UTF-8"sizin için <form>etiketi. Sunucuda, çıktınızın UTF-8 kodlu olduğundan ve web sunucunuzun tarayıcıya bunun olduğunu ( Content-Typebaşlık yoluyla ) söylediğinden emin olmak istersiniz . Rentzsch.tumblr.com/post/9133498042/… adresini ziyaret edin. Bunların hepsini yaparsanız ve bir tarayıcı karakteri doğru şekilde görüntülemiyorsa, karakteri bir varlıkla değiştirmek hiçbir fark yaratmaz.
Paul D. Waite

@Chris, Ruby on Rails ile oluşturulmuş bir CMS'de çalışıyor.
JGallardo

İstemci tarafı JavaScript, varlıkların olmadığı DOM üzerinde çalıştığından, istemci tarafı JavaScript'te bir karakteri HTML varlık referansına değiştirmek yanlıştır. Öğelere "®" sarmak sup, çözebileceğinden daha fazla soruna yol açma eğilimindedir, çünkü birçok yazı tipinde "®" küçüktür ve alt simge konumundadır, bu nedenle onu tanınmaz hale getirebilirsiniz.
Jukka K. Korpela

@ JukkaK.Korpela, bazı html varlıklarının düzgün görüntülenmeyeceğini ele almam gerektiğini düşünürsek, bunu nasıl ele alırsınız? <sup>Blog gönderileri için kullanılan belirli yazı tiplerini test ettiğim için içeri sarmak bir sorun değil, ancak bu dikkate alınması gereken iyi bir nokta.
JGallardo

Yanıtlar:


176

Belirli bir unicode aralığındaki herhangi bir karakteri html varlığı eşdeğeriyle değiştirmek için normal ifadeyi kullanabilirsiniz. Kod şuna benzer:

var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) {
   return '&#'+i.charCodeAt(0)+';';
});

Bu kod, verilen aralıktaki tüm karakterleri (unicode 00A0 - 9999 ve ayrıca ve işareti, daha büyük ve daha küçük) html varlık eşdeğerleri ile değiştirir, bu da elde ettiğimiz unicode değerinin basitçe &#nnn;olduğu yerdir .nnncharCodeAt

Burada nasıl çalıştığını görün: http://jsfiddle.net/E3EqX/13/ (bu örnek, örnekte kullanılan öğe seçiciler için jQuery kullanır. Yukarıdaki temel kodun kendisi jQuery kullanmaz)

Bu dönüştürmeleri yapmak tüm sorunları çözmez - UTF8 karakter kodlamasını kullandığınızdan emin olun, veritabanınızın dizeleri UTF8'de depoladığından emin olun. Sen hala karakterler kontrolden çıkarak sistem yazı yapılandırmasına ve diğer konularda bağlı düzgün görüntülenmez örneklerini görebilirsiniz.

Dokümantasyon


Jsfiddle için çok teşekkür ederim. Yani bunu uygulamak için. Bunu .jsdosyama ekleyebilir ve diğer şeyleri bir <sup>?
JGallardo

2
@JGallardo Örneği biraz yeniden yazdım, böylece supetiketi (veya başka bir etiketi) ekliyor ve bir işlevde bulunuyor: jsfiddle.net/E3EqX/4 . Bunu kullanmak için "encodeAndWrap" işlevini projenize kopyalamanız gerekir.
Chris Baker

1
@Chris, düzgün kod pasajı için teşekkürler, ancak tek bir hatası var: "[\ u00A0- \ u99999]" yapmasını beklediğiniz şeyi yapmaz, aksine eşittir "[\ u00A0- \ u9999] | 9 "- yani. "9" karakteri de yanlış bir şekilde bir HTML varlığıyla değiştirilirdi. Bunu keman içinde de deneyebilirsiniz. Cevap için bir düzeltme önereceğim.
SB

@SB Bu not için teşekkürler, son onaylama oylamasını bile yapmam gerekiyor :)
Chris Baker

1
@Mathias Bynens cevabının daha eksiksiz olduğunu kabul etmeme rağmen, çözümü 84KB ve bu da alternatif bir cevap aramaya devam etmemi sağladı. Bu tamam gibi görünüyor, ancak aynı zamanda <65 ve> 90 && <97 arasında charCodes içerebilir mi?
Florian Mertens

62

Şu anda kabul edilen yanıtın birkaç sorunu var. Bu gönderi onları açıklıyor ve daha sağlam bir çözüm sunuyor. Bu cevapta önerilen çözüm daha önce şöyleydi:

var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
  return '&#' + i.charCodeAt(0) + ';';
});

iBayrak U +, 00A0 gelen U + 9999 aralığında bir Unicode simge beri gereksiz bir büyük / küçük varyant dışında aynı aralığın olduğu.

mÇünkü bayrak gereksiz ^veya $normal ifadede kullanılmaz.

Neden U + 00A0 ile U + 9999 aralığı? Keyfi görünüyor.

Her neyse, girdideki (astral semboller dahil!) Güvenli ve yazdırılabilir ASCII sembolleri hariç tümünü doğru bir şekilde kodlayan ve tüm adlandırılmış karakter referanslarını (yalnızca HTML4'tekileri değil) uygulayan bir çözüm için, kitaplığı kullanın (sorumluluk reddi: Bu kitaplık benimdir ). BENİOKU'dan:

o ("HTML varlıkları" için) JavaScript'te yazılmış sağlam bir HTML varlık kodlayıcı / kod çözücüdür. Bu destekler HTML uyarınca tüm standardize adlı karakter referansları , kolları belirsiz ve işaretleri ve diğer kenar durumlarda sadece bir tarayıcı yaptığınız gibi , geniş bir test takımı ve var - - Birçok diğer JavaScript çözümleri aykırı diye gayet astral Unicode sembolleri işler. Çevrimiçi bir demo mevcuttur.

Ayrıca bu ilgili Yığın Taşması yanıtına bakın .


12
Ayrıca, HE kitaplığı ... 84KB'dir! Autch ... Bunu daha az bir bağlantı üzerinden bir cep telefonuna indirmeyi dene. Bir yerde uzlaşma sağlanmalı ..
Florian Mertens

1
Küçültülerek + sonra @FlorianMertens gziplemek o ~ 24 KB. Bu hala büyük, ancak günün sonunda HTML varlıklarının kodunu doğru bir şekilde çözmek istiyorsanız, onlarla ilgili tüm verilere ihtiyacınız olacak - bunun yolu yok. Performansı etkilemeden kitaplığı küçültmenin bir yolunu bulabilirseniz, lütfen bir istek gönderin.
Mathias Bynens

2
@MathiasBynens, kitaplığınızın iyi olduğuna şüphe yok, ancak kabul edilen cevaplardaki sorunu vurgulamak için yorum kutusunu kullanabilirsiniz ve lütfen iyileştirilmiş cevabınızı kod bloğunda gönderin
diEcho

3
@drzaus Görüntüler büyük olmaktan kurtulabilir çünkü çok fazla veri depolarlar ve daha az sıkıştırılmış verilerin kodunu çözmek daha hızlıdır. Ancak program kodu farklıdır, çoğu zaman bütün bir kitaplık eklenir ve ondan çok az yararlanılır. Kitaplıkların kodu bazen kendi kodunuzdan daha fazla satır içerir! Ayrıca, çok az kişi kitaplık sorunlarını bulmaya / hatalarını ayıklamaya ve hata raporları göndermeye (hatta kitaplığı güncellemeye) zahmet edecek, bu nedenle denetlenmemiş kodlu birçok kitaplıkta bellek sızıntıları veya diğer sorunlar devam edebilir. Eğer birisi html-güvenli olmayan karakterleri kodlamak / onlardan kaçmak istiyorsa, 80kb değil, sadece birkaç satıra ihtiyaç vardır.
bryc

1
@MarcoKlein Evet, bunu yazımda açıklıyorum. Bu gerçekten de hatalı kod parçacığının yaşadığı bir sorundur. İşaret ettiğim çözümde bu sorun yok. (bkz. “astral semboller dahil!”)
Mathias Bynens

29

Aynı sorunu yaşadım ve varlıklar oluşturmak ve onları normal karakterlere geri çevirmek için 2 işlev yarattım. Aşağıdaki yöntemler herhangi bir dizeyi HTML varlıklarına ve String prototipine geri çevirir

/**
 * Convert a string to HTML entities
 */
String.prototype.toHtmlEntities = function() {
    return this.replace(/./gm, function(s) {
        // return "&#" + s.charCodeAt(0) + ";";
        return (s.match(/[a-z0-9\s]+/i)) ? s : "&#" + s.charCodeAt(0) + ";";
    });
};

/**
 * Create string from HTML entities
 */
String.fromHtmlEntities = function(string) {
    return (string+"").replace(/&#\d+;/gm,function(s) {
        return String.fromCharCode(s.match(/\d+/gm)[0]);
    })
};

Daha sonra aşağıdaki gibi kullanabilirsiniz:

var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æøπ£¨ ƒ™en tést".toHtmlEntities();
console.log("Entities:", str);
console.log("String:", String.fromHtmlEntities(str));

Konsolda çıktı:

Entities: &#68;&#105;&#116;&#32;&#105;&#115;&#32;&#101;&#180;&#8224;&#174;&#165;&#168;&#169;&#729;&#8747;&#248;&#8230;&#710;&#402;&#8710;&#247;&#8721;&#8482;&#402;&#8710;&#230;&#248;&#960;&#163;&#168;&#160;&#402;&#8482;&#101;&#110;&#32;&#116;&#163;&#101;&#233;&#115;&#116;
String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æøπ£¨ ƒ™en t£eést 

Bu çözüm tvOS'ta da çalışır, böylece her durumda iyi kodlama sorunlarını çözebilir.
loretoparisi

4
Bu biraz aşırı değil mi? Her şeyi HTML varlıklarına, hatta "abc", "123" gibi "güvenli" karakterlere bile dönüştürüyorsunuz ... boşluklar bile
AJPerez

1
Bu kötü bir cevap. Web'deki belgelerin% 50'den fazlası çoğunlukla latin1 ve bazı utf-8 içerir. Güvenli karakter kodlamanız, herhangi bir avantaj olmadan boyutunu% 500 ila% 600 artıracaktır.
HoldOffHunger

Lütfen mçapa içermeyen bir desende desen değiştiricinin amacını açıklayın . Yani snokta içeren desen için mi kullanmak istiyorsunuz ?
mickmackusa

19

Herhangi bir kitaplık olmadan, IE <9'u desteklemeniz gerekmiyorsa, bir html öğesi oluşturabilir ve içeriğini Node.textContent ile ayarlayabilirsiniz :

var str = "<this is not a tag>";
var p = document.createElement("p");
p.textContent = str;
var converted = p.innerHTML;

İşte bir örnek: https://jsfiddle.net/1erdhehv/


2
TextContent yerine neden innerText kullanmıyoruz?
Rick

@Rick, yanıtta bağlantılı textContent MDN belgesine bir şans verin. Alıntı "textContent ve HTMLElement.innerText kolayca karıştırılır, ancak iki özellik önemli açılardan farklıdır ."
Adarsha

18

Bunu kullanabilirsin.

var escapeChars = {
  '¢' : 'cent',
  '£' : 'pound',
  '¥' : 'yen',
  '€': 'euro',
  '©' :'copy',
  '®' : 'reg',
  '<' : 'lt',
  '>' : 'gt',
  '"' : 'quot',
  '&' : 'amp',
  '\'' : '#39'
};

var regexString = '[';
for(var key in escapeChars) {
  regexString += key;
}
regexString += ']';

var regex = new RegExp( regexString, 'g');

function escapeHTML(str) {
  return str.replace(regex, function(m) {
    return '&' + escapeChars[m] + ';';
  });
};

https://github.com/epeli/underscore.string/blob/master/escapeHTML.js

var htmlEntities = {
    nbsp: ' ',
    cent: '¢',
    pound: '£',
    yen: '¥',
    euro: '€',
    copy: '©',
    reg: '®',
    lt: '<',
    gt: '>',
    quot: '"',
    amp: '&',
    apos: '\''
};

function unescapeHTML(str) {
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
        var match;

        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
            /*eslint no-cond-assign: 0*/
        } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
            /*eslint no-cond-assign: 0*/
        } else if (match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};

4
Kodlanabilir karakterlerin rastgele bir alt kümesini manuel olarak eklemek, muhtemelen kendiniz ve iş arkadaşlarınız için sorun depolamaktadır. Karakterlerin kodlanması gereken tek bir yetki, muhtemelen tarayıcı veya kapsamlı ve bakımı büyük olasılıkla belirli bir kitaplıkta başarısız olan bir yetki olmalıdır.
user234461

Harika bir nokta @ user234461. Biri bu tek otoriteyi bulursa, sorgulayan zihinleri (benim gibi) bilmek ister!
idungotnosn

7

Html varlıklarını birden fazla kodlamaktan kaçınmak istiyorsanız

function encodeHTML(str){
    return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, function(full, char, next) {
      if(char !== '&' || next !== '#'){
        if(/[\u00A0-\u9999<>&]/.test(next))
          next = '&#' + next.charCodeAt(0) + ';';

        return '&#' + char.charCodeAt(0) + ';' + next;
      }

      return full;
    });
}

function decodeHTML(str){
    return str.replace(/&#([0-9]+);/g, function(full, int) {
        return String.fromCharCode(parseInt(int));
    });
}

# Misal

var text = "<a>Content &#169; <#>&<&#># </a>";

text = encodeHTML(text);
console.log("Encode 1 times: " + text);

// &#60;a&#62;Content &#169; &#60;#&#62;&#38;&#60;&#38;#&#62;# &#60;/a&#62;

text = encodeHTML(text);
console.log("Encode 2 times: " + text);

// &#60;a&#62;Content &#169; &#60;#&#62;&#38;&#60;&#38;#&#62;# &#60;/a&#62;

text = decodeHTML(text);
console.log("Decoded: " + text);

// <a>Content © <#>&<&#># </a>

Bu, yalnızca başlamak için karışık, kısmen kaçılmış bir metniniz varsa ve tüm dizeleri düzgün bir şekilde kodlayamadığı için hatalar <#>ortaya çıkardığında yararlıdır: şu şekilde çıkacaktır<#&#62;
Rick

@Rick Beni fark ettiğiniz için teşekkürler, daha iyi hale getirmek için cevabımı güncelledim.
StefansArya

4

HTML Özel Karakterleri ve ESCAPE CODES

Ayrılmış Karakterler HTML ile öncelenmelidir: HTML, XHTML veya XML'de herhangi bir Unicode karakterini [Örn: & - U + 00026] sadece ASCII karakterleri kullanarak temsil etmek için bir karakter kaçışını kullanabiliriz. Sayısal karakter referansları [ Ör: ve işareti (&) - &#38;] & Adlandırılmış karakter referansları [Örn: &amp;] türleridir character escape used in markup.


Önceden Tanımlanmış Varlıklar

    Original Character     XML entity replacement    XML numeric replacement  
                  <                                    &lt;                                           &#60;                    
                  >                                     &gt;                                         &#62;                    
                  "                                     &quot;                                      &#34;                    
                  &                                   &amp;                                       &#38;                    
                   '                                    &apos;                                      &#39;                    

HTML Etiketlerini kullandığımız web sayfasında normal bir form olarak görüntülemek için <pre>, <code>etiketler veya onlardan kaçabiliriz. Herhangi bir oluşum ile değiştirerek dize Kaçış "&"dize tarafından karakteri "&amp;"ve herhangi oluşumları ">"dize ile karakteri "&gt;". Ör:stackoverflow post

function escapeCharEntities() {
    var map = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'": "&apos;"
    };
    return map;
}

var mapkeys = '', mapvalues = '';
var html = {
    encodeRex : function () {
        return  new RegExp(mapkeys, 'g'); // "[&<>"']"
    }, 
    decodeRex : function () {
        return  new RegExp(mapvalues, 'g'); // "(&amp;|&lt;|&gt;|&quot;|&apos;)"
    },
    encodeMap : JSON.parse( JSON.stringify( escapeCharEntities () ) ), // json = {&: "&amp;", <: "&lt;", >: "&gt;", ": "&quot;", ': "&apos;"}
    decodeMap : JSON.parse( JSON.stringify( swapJsonKeyValues( escapeCharEntities () ) ) ),
    encode : function ( str ) {
        var encodeRexs = html.encodeRex();
        console.log('Encode Rex: ', encodeRexs); // /[&<>"']/gm
        return str.replace(encodeRexs, function(m) { console.log('Encode M: ', m); return html.encodeMap[m]; }); // m = < " > SpecialChars
    },
    decode : function ( str ) {
        var decodeRexs = html.decodeRex();
        console.log('Decode Rex: ', decodeRexs); // /(&amp;|&lt;|&gt;|&quot;|&apos;)/g
        return str.replace(decodeRexs, function(m) { console.log('Decode M: ', m); return html.decodeMap[m]; }); // m = &lt; &quot; &gt;
    }
};

function swapJsonKeyValues ( json ) {
    var count = Object.keys( json ).length;
    var obj = {};
    var keys = '[', val = '(', keysCount = 1;
    for(var key in json) {
        if ( json.hasOwnProperty( key ) ) {
            obj[ json[ key ] ] = key;
            keys += key;
            if( keysCount < count ) {
                val += json[ key ]+'|';
            } else {
                val += json[ key ];
            }
            keysCount++;
        }
    }
    keys += ']';    val  += ')';
    console.log( keys, ' == ', val);
    mapkeys = keys;
    mapvalues = val;
    return obj;
}

console.log('Encode: ', html.encode('<input type="password" name="password" value=""/>') ); 
console.log('Decode: ', html.decode(html.encode('<input type="password" name="password" value=""/>')) );

O/P:
Encode:  &lt;input type=&quot;password&quot; name=&quot;password&quot; value=&quot;&quot;/&gt;
Decode:  <input type="password" name="password" value=""/>

Bu, Json biçiminde html kaynak kodunu iframe srcdoc dizesine eklemek için mükemmeldir.
Nime Cloud

Buna ® dahil değildir, bu yüzden OP'ye yardımcı olmayacaktır. Ek olarak, bu JS, diğer çözümlerin çoğundan çok daha karmaşıktır, sadece bunun gibi kısa bir eşleme kullananlar bile. swapJsonKeyValues, gerekli yan etkilere sahip olduğu için kötü adlandırılmış (mapkeys ve mapvalues ​​tanımlanıyor)
Rick

@mickmackusa Gönderiyi hata ayıklama değerleri ile güncelledim. mbir girdi dizesinin özel karakterlerini tutar.
Yash

Gönderide herhangi bir hata varsa. Bu nedenle, lütfen gönderiyi düzeltmeye çalışın ve yorumları sağlayın.
Yash

3
var htmlEntities = [
            {regex:/&/g,entity:'&amp;'},
            {regex:/>/g,entity:'&gt;'},
            {regex:/</g,entity:'&lt;'},
            {regex:/"/g,entity:'&quot;'},
            {regex:/á/g,entity:'&aacute;'},
            {regex:/é/g,entity:'&eacute;'},
            {regex:/í/g,entity:'&iacute;'},
            {regex:/ó/g,entity:'&oacute;'},
            {regex:/ú/g,entity:'&uacute;'}
        ];

total = <some string value>

for(v in htmlEntities){
    total = total.replace(htmlEntities[v].regex, htmlEntities[v].entity);
}

Bir dizi çözümü


3
Lütfen bunun sorunu nasıl daha iyi bir şekilde çözdüğünü açıklayın. İlk bakışta bu çözümün daha yavaş olduğu anlaşılıyor çünkü dizeyi tek seferde değil birden çok geçişte değiştiriyor. Ancak yanılmış olabilirim. Her iki durumda da, gönderinizi bir açıklama ile yedeklemelisiniz.
Jack Giffin

Bu bir alternatif, regex'i doğrudan diziden kullanabilirsiniz ...: D
Cesar De la Cruz

Bu, her karakter için bir normal ifadedir (v in .... için). Tüm UTF-8'i kapsamak istiyorsanız, bu 65.000 normal ifade ve 65.000 yürütme satırı olacaktır.
HoldOffHunger

2
Yalnızca üç karakteri varlıklara dönüştürmekle ilgileniyorum, bu nedenle bu yanıt benim durumumda daha iyi ve burada olduğuna sevindim
Drew

2

Zaten jQuery kullanıyorsanız, deneyin html().

$('<div>').text('<script>alert("gotcha!")</script>').html()
// "&lt;script&gt;alert("gotcha!")&lt;/script&gt;"

Bir bellek içi metin düğümü somutlaştırılır ve html()ona çağrılır.

Çirkin, hafızayı biraz boşa harcıyor ve hekütüphane kadar kapsamlı olup olmadığı hakkında hiçbir fikrim yok ama zaten jQuery kullanıyorsanız, belki bu sizin için bir seçenektir.

Blog gönderisinden alınmıştır HTML varlıklarını Felix Geisendörfer tarafından jQuery ile kodlayın .


3
Her seferinde bir düğümün somutlaştırılmasını önlemek için düğümü kaydedebilir var converter=$("<div>");ve daha sonra yeniden kullanabilirsiniz: html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM

1

Bazen sadece her karakteri kodlamak istersiniz ... Bu işlev regxp'deki "hiçbir şey hariç her şeyin" yerine geçer.

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}


1
Değiştir ^bir tarafından .konserve emoji'yi için: function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}.
İsviçreli Bay

1

Ourcodeworld Ourcodeworld'ün öğreticisine göz atın - html varlıklarını javascript ile kodlayın ve kodunu çözün

En önemlisi, kütüphane örneği

he.encode('foo © bar ≠ baz ???? qux');
// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'

// Passing an `options` object to `encode`, to explicitly encode all symbols:
he.encode('foo © bar ≠ baz ???? qux', {
 'encodeEverything': true
});

he.decode('foo &copy; bar &ne; baz &#x1D306; qux');
// → 'foo © bar ≠ baz ???? qux'

Bu kütüphane muhtemelen kodlamanızı daha kolay ve daha iyi yönetir. Popülerdir, düzenli olarak güncellenir ve HTML spesifikasyonuna uyar. Package.json'da görülebileceği gibi, kendisinin bağımlılığı yoktur.


OP vanilla JS'yi istedi ve vanilla JS element.innerText'i sunuyor. Kütüphanenin bir avantajı varsa, lütfen cevabınıza ekleyin.
Rick

0

İşte kodlamayı nasıl uyguladım. Yukarıda verilen cevaplardan ilham aldım.

function encodeHTML(str) {
  const code = {
      ' ' : '&nbsp;',
      '¢' : '&cent;',
      '£' : '&pound;',
      '¥' : '&yen;',
      '€' : '&euro;', 
      '©' : '&copy;',
      '®' : '&reg;',
      '<' : '&lt;', 
      '>' : '&gt;',  
      '"' : '&quot;', 
      '&' : '&amp;',
      '\'' : '&apos;'
  };
  return str.replace(/[\u00A0-\u9999<>\&''""]/gm, (i)=>code[i]);
}

// TEST
console.log(encodeHTML("Dolce & Gabbana"));
console.log(encodeHTML("Hamburgers < Pizza < Tacos"));
console.log(encodeHTML("Sixty > twelve"));
console.log(encodeHTML('Stuff in "quotation marks"'));
console.log(encodeHTML("Schindler's List"));
console.log(encodeHTML("<>"));


\ u00A0- \ u9999 içindeki listenizde olmayan herhangi bir giriş için aralar
Rick

Lütfen mçapa içermeyen bir desende desen değiştiricinin amacını açıklayın .
mickmackusa

-1

Sen kullanabilirsiniz charCodeAt()Belirtilen karakter yüksek 127 den bir değere sahip olmadığını kontrol edin ve kullanarak sayısal karakter referansı dönüştürmek yöntemi toString(16).


4
Sihirli sayı 127ve bunun nasıl / neden çalıştığı hakkında biraz ekleyebilirseniz iyi olur ;)
yckart

-1
replaceHtmlEntities(text) {
  var tagsToReplace = {
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
  };
  var newtext = text;
  for (var tag in tagsToReplace) {
    if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) {
      var regex = new RegExp(tag, 'g');
      newtext = newtext.replace(regex, tagsToReplace[tag]);
    }
  }
  return newtext;
}

-1

<!DOCTYPE html>
<html>
<style>
button {
backround: #ccc;
padding: 14px;
width: 400px;
font-size: 32px;
}
#demo {
font-size: 20px;
font-family: Arial;
font-weight: bold;
}
</style>
<body>

<p>Click the button to decode.</p>

<button onclick="entitycode()">Html Code</button>

<p id="demo"></p>


<script>
function entitycode() {
  var uri = "quotation  = ark __ &apos; = apostrophe  __ &amp; = ampersand __ &lt; = less-than __ &gt; = greater-than __ 	non- = reaking space __ &iexcl; = inverted exclamation mark __ &cent; = cent __ &pound; = pound __ &curren; = currency __ &yen; = yen __ &brvbar; = broken vertical bar __ &sect; = section __ &uml; = spacing diaeresis __ &copy; = copyright __ &ordf; = feminine ordinal indicator __ &laquo; = angle quotation mark (left) __ &not; = negation __ &shy; = soft hyphen __ &reg; = registered trademark __ &macr; = spacing macron __ &deg; = degree __ &plusmn; = plus-or-minus  __ &sup2; = superscript 2 __ &sup3; = superscript 3 __ &acute; = spacing acute __ &micro; = micro __ &para; = paragraph __ &middot; = middle dot __ &cedil; = spacing cedilla __ &sup1; = superscript 1 __ &ordm; = masculine ordinal indicator __ &raquo; = angle quotation mark (right) __ &frac14; = fraction 1/4 __ &frac12; = fraction 1/2 __ &frac34; = fraction 3/4 __ &iquest; = inverted question mark __ &times; = multiplication __ &divide; = division __ &Agrave; = capital a, grave accent __ &Aacute; = capital a, acute accent __ &Acirc; = capital a, circumflex accent __ &Atilde; = capital a, tilde __ &Auml; = capital a, umlaut mark __ &Aring; = capital a, ring __ &AElig; = capital ae __ &Ccedil; = capital c, cedilla __ &Egrave; = capital e, grave accent __ &Eacute; = capital e, acute accent __ &Ecirc; = capital e, circumflex accent __ &Euml; = capital e, umlaut mark __ &Igrave; = capital i, grave accent __ &Iacute; = capital i, acute accent __ &Icirc; = capital i, circumflex accent __ &Iuml; = capital i, umlaut mark __ &ETH; = capital eth, Icelandic __ &Ntilde; = capital n, tilde __ &Ograve; = capital o, grave accent __ &Oacute; = capital o, acute accent __ &Ocirc; = capital o, circumflex accent __ &Otilde; = capital o, tilde __ &Ouml; = capital o, umlaut mark __ &Oslash; = capital o, slash __ &Ugrave; = capital u, grave accent __ &Uacute; = capital u, acute accent __ &Ucirc; = capital u, circumflex accent __ &Uuml; = capital u, umlaut mark __ &Yacute; = capital y, acute accent __ &THORN; = capital THORN, Icelandic __ &szlig; = small sharp s, German __ &agrave; = small a, grave accent __ &aacute; = small a, acute accent __ &acirc; = small a, circumflex accent __ &atilde; = small a, tilde __ &auml; = small a, umlaut mark __ &aring; = small a, ring __ &aelig; = small ae __ &ccedil; = small c, cedilla __ &egrave; = small e, grave accent __ &eacute; = small e, acute accent __ &ecirc; = small e, circumflex accent __ &euml; = small e, umlaut mark __ &igrave; = small i, grave accent __ &iacute; = small i, acute accent __ &icirc; = small i, circumflex accent __ &iuml; = small i, umlaut mark __ &eth; = small eth, Icelandic __ &ntilde; = small n, tilde __ &ograve; = small o, grave accent __ &oacute; = small o, acute accent __ &ocirc; = small o, circumflex accent __ &otilde; = small o, tilde __ &ouml; = small o, umlaut mark __ &oslash; = small o, slash __ &ugrave; = small u, grave accent __ &uacute; = small u, acute accent __ &ucirc; = small u, circumflex accent __ &uuml; = small u, umlaut mark __ &yacute; = small y, acute accent __ &thorn; = small thorn, Icelandic __ &yuml; = small y, umlaut mark";
  var enc = encodeURI(uri);
  var dec = decodeURI(enc);
  var res = dec;
  document.getElementById("demo").innerHTML = res;
}
</script>

</body>
</html>


Bu, soruyu yanıtlıyor gibi görünmüyor ve yalnızca kodlu bir yanıt. Lütfen kodun ne yaptığı ve soruyla nasıl ilişkili olduğu hakkında bir açıklama yapın.
Rick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.