Enkode entitas html dalam javascript

100

Saya bekerja di CMS yang memungkinkan pengguna memasukkan konten. Masalahnya adalah ketika mereka menambahkan simbol ®, itu mungkin tidak ditampilkan dengan baik di semua browser. Saya ingin membuat daftar simbol yang harus dicari, dan kemudian dikonversi ke entitas html yang sesuai. Sebagai contoh

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

Setelah konversi, itu perlu dibungkus dalam <sup>tag, menghasilkan ini:

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

Karena ukuran font dan gaya padding tertentu diperlukan:

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

Akankah JavaScript menjadi seperti ini?

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([?]);
}

Di mana "[?]" Berarti ada sesuatu yang saya tidak yakin.

Detil tambahan:

  • Saya ingin melakukan ini dengan JavaScript murni, bukan sesuatu yang membutuhkan perpustakaan seperti jQuery, terima kasih.
  • Backend adalah Ruby
  • Menggunakan RefineryCMS yang dibangun dengan Ruby on Rails
JGallardo
sumber
Apa backend Anda? Jika ini adalah php, ada fungsi untuk mengurusnya untuk Anda, dan saya yakin bahasa lain juga memilikinya. Juga, Google: developwithstyle.com/articles/2010/06/29/…
Chris Baker
5
Solusi yang lebih baik mungkin menerima dan mengeluarkan teks berenkode UTF-8. Setiap browser yang digunakan saat ini mendukung UTF-8. Di sisi HTML, Anda ingin menambahkan accept-charset="UTF-8"ke <form>tag Anda . Di server, Anda ingin memastikan output Anda dikodekan UTF-8, dan server web Anda memberi tahu browser bahwa itu (melalui Content-Typeheader). Lihat rentzsch.tumblr.com/post/9133498042/… Jika Anda melakukan semua itu, dan browser tidak menampilkan karakter dengan benar, maka mengganti karakter dengan entitas tidak akan membuat perbedaan apa pun.
Paul D. Waite
@Chris bekerja dalam CMS yang dibangun dengan Ruby on Rails.
JGallardo
Salah jika mengubah karakter menjadi referensi entitas HTML di JavaScript sisi klien, karena JavaScript sisi klien beroperasi pada DOM, di mana entitas tidak ada. Membungkus "®" ke dalam supelemen cenderung menyebabkan lebih banyak masalah daripada yang mungkin bisa dipecahkan, karena di banyak font, "®" berukuran kecil dan dalam posisi subskrip, jadi Anda akan menguranginya menjadi tidak dapat dikenali.
Jukka K. Korpela
@ JukkaK.Korpela, jadi mengingat saya perlu menjelaskan bahwa beberapa entitas html tidak akan ditampilkan dengan benar, bagaimana Anda mengatasinya? Dan membungkus <sup>tidak menjadi masalah karena saya telah menguji font khusus yang digunakan untuk posting blog, tetapi itu adalah hal yang baik untuk dipertimbangkan.
JGallardo

Jawaban:

176

Anda dapat menggunakan regex untuk mengganti karakter apa pun dalam rentang unicode tertentu dengan entitas html yang setara. Kode tersebut akan terlihat seperti ini:

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

Kode ini akan mengganti semua karakter dalam rentang yang diberikan (unicode 00A0 - 9999, serta ampersand, lebih besar & kurang dari) dengan entitas html yang setara, yang merupakan &#nnn;asal nnndari nilai unicode charCodeAt.

Lihat aksinya di sini: http://jsfiddle.net/E3EqX/13/ (contoh ini menggunakan jQuery untuk pemilih elemen yang digunakan dalam contoh. Kode dasar itu sendiri, di atas, tidak menggunakan jQuery)

Membuat konversi ini tidak menyelesaikan semua masalah - pastikan Anda menggunakan pengkodean karakter UTF8, pastikan database Anda menyimpan string dalam UTF8. Anda mungkin masih melihat kejadian di mana karakter tidak ditampilkan dengan benar, tergantung pada konfigurasi font sistem dan masalah lain di luar kendali Anda.

Dokumentasi

Chris Baker
sumber
Terima kasih banyak untuk jsfiddle-nya. Jadi untuk menerapkan ini. Saya bisa menambahkan ini ke .jsfile saya dan menambahkan hal-hal lain untuk dibungkus dengan <sup>?
JGallardo
2
@JGallardo Saya menulis ulang contoh sedikit sehingga menambahkan suptag (atau tag lainnya), dan itu terkandung dalam fungsi: jsfiddle.net/E3EqX/4 . Untuk menggunakan ini, Anda perlu menyalin fungsi "encodeAndWrap" ke proyek Anda.
Chris Baker
1
@Chris terima kasih untuk cuplikan kode yang rapi, meskipun memiliki satu bug: "[\ u00A0- \ u99999]" tidak melakukan apa yang Anda harapkan, tetapi sama dengan "[\ u00A0- \ u9999] | 9 "- yaitu. karakter "9" akan diganti secara keliru dengan entitas HTML juga. Anda juga bisa mencobanya di biola. Saya akan menyarankan perbaikan untuk jawabannya.
SB
@SB Terima kasih atas catatan itu, saya bahkan harus memberikan suara persetujuan akhir :)
Chris Baker
1
Walaupun saya setuju jawaban @mathias Bynens lebih lengkap, solusinya 84KB, dan itu membuat saya terus mencari alternatif. Ini sepertinya OK-ish, namun dapatkah seseorang juga menyertakan charCodes <65, dan antara> 90 && <97?
Florian Mertens
62

Jawaban yang diterima saat ini memiliki beberapa masalah. Posting ini menjelaskannya, dan menawarkan solusi yang lebih kuat. Solusi yang disarankan dalam jawaban itu sebelumnya memiliki:

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

The ibendera berlebihan karena tidak ada simbol Unicode di kisaran dari U + 00A0 untuk U + 9999 memiliki huruf besar / huruf kecil varian yang berada di luar kisaran yang sama.

The mbendera berlebihan karena ^atau $tidak digunakan dalam ekspresi reguler.

Mengapa rentang U + 00A0 hingga U + 9999? Sepertinya sewenang-wenang.

Bagaimanapun, untuk solusi yang dengan benar mengkodekan semua kecuali simbol ASCII yang aman & dapat dicetak dalam input (termasuk simbol astral!), Dan menerapkan semua referensi karakter bernama (tidak hanya yang ada di HTML4), gunakan pustaka he (penafian: Pustaka ini milik saya ). Dari README-nya:

he (untuk "entitas HTML") adalah pembuat enkode / dekoder entitas HTML yang kuat yang ditulis dalam JavaScript. Ini mendukung semua referensi karakter bernama standar sesuai HTML , menangani ampersand ambigu dan kasus tepi lainnya seperti browser , memiliki rangkaian pengujian yang luas, dan - bertentangan dengan banyak solusi JavaScript lainnya - ia menangani simbol Unicode astral dengan baik. Demo online tersedia.

Juga lihat jawaban Stack Overflow yang relevan ini .

Mathias Bynens
sumber
12
Juga, perpustakaan HE adalah ... 84KB! Autch ... Coba download itu di ponsel dengan koneksi yang lebih rendah. Sebuah kompromi harus dibuat di suatu tempat ..
Florian Mertens
1
@FlorianMertens Setelah mengecilkan + gzip dia ~ 24 KB. Itu masih besar, tetapi pada akhirnya jika Anda ingin memecahkan kode entitas HTML dengan benar, Anda akan membutuhkan semua data di dalamnya - tidak ada jalan lain. Jika Anda dapat menemukan cara untuk membuat perpustakaan lebih kecil tanpa mempengaruhi kinerja, silakan kirim permintaan penarikan.
Mathias Bynens
2
@MathiasBynens, tidak diragukan lagi perpustakaan Anda bagus tetapi Anda dapat menggunakan kotak komentar untuk menyoroti masalah dalam jawaban yang diterima dan kirimkan jawaban Anda yang ditingkatkan dalam blok kode
diEcho
3
@drzaus Gambar bisa menjadi besar karena menyimpan banyak data, dan lebih sedikit data yang dikompresi lebih cepat untuk memecahkan kode. Namun kode program berbeda, seringkali seluruh pustaka ditambahkan dan sedikit kegunaannya. Kode pustaka terkadang berisi lebih banyak baris daripada kode Anda sendiri! Ditambah sedikit yang akan repot untuk menemukan / men-debug masalah lib dan mengirim laporan bug (atau bahkan memperbarui lib), sehingga kebocoran memori atau masalah lain dapat tetap ada dalam perangkat lunak dengan banyak lib dengan kode yang tidak dicentang. Jika seseorang hanya ingin mengenkode / melarikan diri dari karakter html-unsafe, hanya diperlukan beberapa baris, bukan 80kb.
bryc
1
@MarcoKlein Ya, saya jelaskan di posting saya. Ini memang masalah yang dialami oleh cuplikan kode buggy. Solusi yang saya tunjukkan tidak memiliki masalah itu. (lihat “termasuk simbol astral!”)
Mathias Bynens
29

Saya memiliki masalah yang sama dan membuat 2 fungsi untuk membuat entitas dan menerjemahkannya kembali ke karakter normal. Metode berikut menerjemahkan string apa pun ke entitas HTML dan kembali ke prototipe String

/**
 * 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]);
    })
};

Anda kemudian dapat menggunakannya sebagai berikut:

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

Output di konsol:

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 
ar34z.dll
sumber
Solusi ini juga berfungsi di tvOS, sehingga dapat menyelesaikan masalah encoding dengan baik di semua kasus.
loretoparisi
4
Bukankah itu sedikit ekstrim? Anda mengonversi semuanya menjadi entitas HTML, bahkan karakter "aman" seperti "abc", "123" ... bahkan spasi putih
AJPerez
1
Ini jawaban yang buruk. 50% + dokumen di web sebagian besar berisi latin1 dengan utf-8. Pengodean karakter aman Anda akan meningkatkan ukurannya sebesar 500% menjadi 600%, tanpa keuntungan apa pun.
HoldOffHunger
Jelaskan tujuan mpengubah pola dalam pola yang tidak memiliki jangkar. Jadi maksud Anda gunakan suntuk pola yang mengandung titik?
mickmackusa
19

Tanpa pustaka apa pun, jika Anda tidak perlu mendukung IE <9, Anda dapat membuat elemen html dan mengatur isinya dengan Node.textContent :

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

Berikut ini contohnya: https://jsfiddle.net/1erdhehv/

antoineMoPa
sumber
2
Mengapa tidak menggunakan innerText sebagai ganti textContent?
Rick
@ Rick, coba dokumen MDN untuk textContent yang ditautkan dalam jawaban. Mengutipnya, "textContent dan HTMLElement.innerText mudah membingungkan, tetapi kedua properti itu berbeda dalam hal yang penting ."
Adarsha
17

Anda bisa menggunakan ini.

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;
        }
    });
};
takdeniz
sumber
4
Menambahkan secara manual subset acak dari karakter yang dapat dikodekan kemungkinan akan menimbulkan masalah bagi Anda dan kolega Anda di kemudian hari. Harus ada otoritas tunggal yang karakter harus dikodekan, mungkin browser atau gagal perpustakaan tertentu yang cenderung komprehensif dan dipelihara.
pengguna234461
Bagus sekali, @ pengguna234461. Jika ada yang menemukan otoritas tunggal itu, pikiran yang ingin tahu (seperti saya) akan senang mengetahuinya!
idungotnosn
7

Jika Anda ingin menghindari encode entitas html lebih dari sekali

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));
    });
}

# Contoh

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>
StefansArya
sumber
Ini hanya berguna jika Anda memiliki teks campuran sebagian yang lolos untuk memulai, dan itu memperkenalkan bug karena tidak dapat mengenkode semua string dengan benar: <#>akan keluar sebagai<#&#62;
Rick
@ Rick Terima kasih telah memperhatikan saya tentang itu, saya telah memperbarui jawaban saya untuk membuatnya lebih baik.
StefansArya
4

Karakter Khusus HTML & nya ESCAPE CODES

Karakter yang Dicadangkan harus di-escape oleh HTML: Kita dapat menggunakan karakter escape untuk mewakili karakter Unicode apa pun [Contoh: & - U + 00026] dalam HTML, XHTML atau XML hanya menggunakan karakter ASCII. Referensi karakter numerik [ Mis: ampersand (&) - &#38;] & Referensi karakter bernama [Ex: &amp;] adalah tipe dari character escape used in markup.


Entitas yang Ditetapkan Sebelumnya

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

Untuk menampilkan Tag HTML sebagai bentuk normal di halaman web yang kita gunakan <pre>, <code>tag atau kita dapat menghindarinya. Meloloskan diri dari string dengan mengganti kemunculan "&"karakter apa pun dengan string "&amp;"dan kemunculan ">"karakter apa pun dengan string "&gt;". Ex: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=""/>
Yash
sumber
Ini bagus untuk menambahkan kode sumber html dalam format Json ke dalam string srcdoc iframe.
Nime Cloud
Ini tidak termasuk ®, jadi tidak akan membantu OP. Selain itu, JS ini jauh lebih rumit daripada solusi lainnya, bahkan solusi yang hanya menggunakan pemetaan singkat seperti ini. swapJsonKeyValues ​​dinamai dengan buruk karena memiliki efek samping yang diperlukan (mendefinisikan kunci peta dan nilai peta)
Rick
@mickmackusa Saya telah memperbarui posting dengan nilai debug. mmemegang karakter khusus dari String input.
Yash
Jika ada kesalahan dalam posting. Jadi, silahkan coba koreksi postingan tersebut dan berikan komentarnya.
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);
}

Solusi array

Cesar De la Cruz
sumber
3
Jelaskan bagaimana ini menyelesaikan masalah dengan cara unik yang lebih baik daripada di atas. Sekilas, akan tampak bahwa solusi ini lebih lambat karena mengubah string dalam beberapa lintasan alih-alih sekaligus. Namun, saya mungkin salah. Apa pun itu, Anda harus mem-backup postingan Anda dengan penjelasan.
Jack Giffin
Alternatifnya, Anda dapat menggunakan regex langsung dari array ...: D
Cesar De la Cruz
Ini adalah satu ekspresi reguler untuk setiap karakter (untuk v di ....). Jika Anda ingin mencakup semua UTF-8, ini akan menjadi 65.000 regex dan 65.000 baris eksekusi.
HoldOffHunger
2
Saya hanya tertarik untuk mengubah tiga karakter menjadi entitas jadi jawaban ini lebih baik dalam kasus saya dan saya senang ada di sini
Drew
2

Jika Anda sudah menggunakan jQuery, coba html().

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

Node teks dalam memori dibuat, dan html()dipanggil di atasnya.

Itu jelek, itu membuang sedikit memori, dan saya tidak tahu apakah itu selengkap sesuatu seperti heperpustakaan tetapi jika Anda sudah menggunakan jQuery, mungkin ini adalah pilihan untuk Anda.

Diambil dari posting blog Menyandikan entitas HTML dengan jQuery oleh Felix Geisendörfer.

Jared Beck
sumber
3
Untuk menghindari membuat node setiap kali, Anda dapat menyimpan node: var converter=$("<div>");dan kemudian menggunakannya kembali: html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM
1

Terkadang Anda hanya ingin menyandikan setiap karakter ... Fungsi ini menggantikan "semuanya kecuali tidak ada" di regxp.

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

Dave Brown
sumber
1
Ganti ^dengan .ke emoji melestarikan: function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}.
Tuan Swiss
1

Lihat tutorial dari Ourcodeworld Ourcodeworld - menyandikan dan mendekode entitas html dengan javascript

Yang terpenting, contoh perpustakaan he

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'

Perpustakaan ini mungkin akan membuat pengkodean Anda lebih mudah dan dikelola dengan lebih baik. Ini populer, diperbarui secara rutin dan mengikuti spesifikasi HTML. Itu sendiri tidak memiliki ketergantungan, seperti yang bisa dilihat di package.json

jking
sumber
OP meminta vanilla JS dan vanilla JS menawarkan element.innerText. Jika ada keuntungan dari perpustakaan, tambahkan itu ke jawaban Anda.
Rick
0

Inilah cara saya menerapkan pengkodean. Saya mengambil inspirasi dari jawaban yang diberikan di atas.

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("<>"));

Dforrunner
sumber
istirahat untuk masukan apa pun dalam \ u00A0- \ u9999 yang tidak ada dalam daftar Anda
Rick
Jelaskan tujuan mpengubah pola dalam pola yang tidak memiliki jangkar.
mickmackusa
-1

Anda dapat menggunakan charCodeAt()metode ini untuk memeriksa apakah karakter yang ditentukan memiliki nilai lebih tinggi dari 127 dan mengubahnya menjadi referensi karakter numerik menggunakan toString(16).

bolistene.dll
sumber
4
Akan lebih baik jika Anda dapat menambahkan sedikit tentang angka ajaib 127dan bagaimana / mengapa ini bekerja;)
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;
}
Prasath Mani
sumber
-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>

Vinod Kumar
sumber
Tampaknya ini tidak menjawab pertanyaan, dan ini hanya jawaban kode. Berikan deskripsi tentang fungsi kode dan kaitannya dengan pertanyaan.
Rick