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>®</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
javascript
html
JGallardo
sumber
sumber
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 (melaluiContent-Type
header). 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.sup
elemen 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.<sup>
tidak menjadi masalah karena saya telah menguji font khusus yang digunakan untuk posting blog, tetapi itu adalah hal yang baik untuk dipertimbangkan.Jawaban:
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;
asalnnn
dari nilai unicodecharCodeAt
.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
String.charCodeAt
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAtsumber
.js
file saya dan menambahkan hal-hal lain untuk dibungkus dengan<sup>
?sup
tag (atau tag lainnya), dan itu terkandung dalam fungsi: jsfiddle.net/E3EqX/4 . Untuk menggunakan ini, Anda perlu menyalin fungsi "encodeAndWrap" ke proyek Anda.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
i
bendera 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
m
bendera 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:
Juga lihat jawaban Stack Overflow yang relevan ini .
sumber
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: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést
sumber
m
pengubah pola dalam pola yang tidak memiliki jangkar. Jadi maksud Anda gunakans
untuk pola yang mengandung titik?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/
sumber
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; } }); };
sumber
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 © <#>&<&#># </a>"; text = encodeHTML(text); console.log("Encode 1 times: " + text); // <a>Content © <#>&<&#># </a> text = encodeHTML(text); console.log("Encode 2 times: " + text); // <a>Content © <#>&<&#># </a> text = decodeHTML(text); console.log("Decoded: " + text); // <a>Content © <#>&<&#># </a>
sumber
<#>
akan keluar sebagai<#>
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 (&) -
&
] & Referensi karakter bernama [Ex:&
] adalah tipe daricharacter escape used in markup
.Entitas yang Ditetapkan Sebelumnya
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"&"
dan kemunculan">"
karakter apa pun dengan string">"
. Ex:stackoverflow post
function escapeCharEntities() { var map = { "&": "&", "<": "<", ">": ">", "\"": """, "'": "'" }; return map; } var mapkeys = '', mapvalues = ''; var html = { encodeRex : function () { return new RegExp(mapkeys, 'g'); // "[&<>"']" }, decodeRex : function () { return new RegExp(mapvalues, 'g'); // "(&|<|>|"|')" }, encodeMap : JSON.parse( JSON.stringify( escapeCharEntities () ) ), // json = {&: "&", <: "<", >: ">", ": """, ': "'"} 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); // /(&|<|>|"|')/g return str.replace(decodeRexs, function(m) { console.log('Decode M: ', m); return html.decodeMap[m]; }); // m = < " > } }; 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: <input type="password" name="password" value=""/> Decode: <input type="password" name="password" value=""/>
sumber
m
memegang karakter khusus dari String input.var htmlEntities = [ {regex:/&/g,entity:'&'}, {regex:/>/g,entity:'>'}, {regex:/</g,entity:'<'}, {regex:/"/g,entity:'"'}, {regex:/á/g,entity:'á'}, {regex:/é/g,entity:'é'}, {regex:/í/g,entity:'í'}, {regex:/ó/g,entity:'ó'}, {regex:/ú/g,entity:'ú'} ]; total = <some string value> for(v in htmlEntities){ total = total.replace(htmlEntities[v].regex, htmlEntities[v].entity); }
Solusi array
sumber
Jika Anda sudah menggunakan jQuery, coba
html()
.$('<div>').text('<script>alert("gotcha!")</script>').html() // "<script>alert("gotcha!")</script>"
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
he
perpustakaan 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.
sumber
var converter=$("<div>");
dan kemudian menggunakannya kembali:html1=converter.text(text1).html(); html2=converter.text(text2).html();
...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)+";"})}
Tampilkan cuplikan kode
function encode(w) { return w.replace(/[^]/g, function(w) { return "&#" + w.charCodeAt(0) + ";"; }); } test.value=encode(document.body.innerHTML.trim());
<textarea id=test rows=11 cols=55>www.WHAK.com</textarea>
sumber
^
dengan.
ke emoji melestarikan:function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
.Lihat tutorial dari Ourcodeworld Ourcodeworld - menyandikan dan mendekode entitas html dengan javascript
Yang terpenting, contoh perpustakaan he
he.encode('foo © bar ≠ baz ???? qux'); // → 'foo © bar ≠ baz 𝌆 qux' // Passing an `options` object to `encode`, to explicitly encode all symbols: he.encode('foo © bar ≠ baz ???? qux', { 'encodeEverything': true }); he.decode('foo © bar ≠ baz 𝌆 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
sumber
Inilah cara saya menerapkan pengkodean. Saya mengambil inspirasi dari jawaban yang diberikan di atas.
function encodeHTML(str) { const code = { ' ' : ' ', '¢' : '¢', '£' : '£', '¥' : '¥', '€' : '€', '©' : '©', '®' : '®', '<' : '<', '>' : '>', '"' : '"', '&' : '&', '\'' : ''' }; 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("<>"));
sumber
m
pengubah pola dalam pola yang tidak memiliki jangkar.Anda dapat menggunakan
charCodeAt()
metode ini untuk memeriksa apakah karakter yang ditentukan memiliki nilai lebih tinggi dari 127 dan mengubahnya menjadi referensi karakter numerik menggunakantoString(16)
.sumber
127
dan bagaimana / mengapa ini bekerja;)replaceHtmlEntities(text) { var tagsToReplace = { '&': '&', '<': '<', '>': '>', }; 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; }
sumber
<!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 __ ' = apostrophe __ & = ampersand __ < = less-than __ > = greater-than __ non- = reaking space __ ¡ = inverted exclamation mark __ ¢ = cent __ £ = pound __ ¤ = currency __ ¥ = yen __ ¦ = broken vertical bar __ § = section __ ¨ = spacing diaeresis __ © = copyright __ ª = feminine ordinal indicator __ « = angle quotation mark (left) __ ¬ = negation __ ­ = soft hyphen __ ® = registered trademark __ ¯ = spacing macron __ ° = degree __ ± = plus-or-minus __ ² = superscript 2 __ ³ = superscript 3 __ ´ = spacing acute __ µ = micro __ ¶ = paragraph __ · = middle dot __ ¸ = spacing cedilla __ ¹ = superscript 1 __ º = masculine ordinal indicator __ » = angle quotation mark (right) __ ¼ = fraction 1/4 __ ½ = fraction 1/2 __ ¾ = fraction 3/4 __ ¿ = inverted question mark __ × = multiplication __ ÷ = division __ À = capital a, grave accent __ Á = capital a, acute accent __ Â = capital a, circumflex accent __ Ã = capital a, tilde __ Ä = capital a, umlaut mark __ Å = capital a, ring __ Æ = capital ae __ Ç = capital c, cedilla __ È = capital e, grave accent __ É = capital e, acute accent __ Ê = capital e, circumflex accent __ Ë = capital e, umlaut mark __ Ì = capital i, grave accent __ Í = capital i, acute accent __ Î = capital i, circumflex accent __ Ï = capital i, umlaut mark __ Ð = capital eth, Icelandic __ Ñ = capital n, tilde __ Ò = capital o, grave accent __ Ó = capital o, acute accent __ Ô = capital o, circumflex accent __ Õ = capital o, tilde __ Ö = capital o, umlaut mark __ Ø = capital o, slash __ Ù = capital u, grave accent __ Ú = capital u, acute accent __ Û = capital u, circumflex accent __ Ü = capital u, umlaut mark __ Ý = capital y, acute accent __ Þ = capital THORN, Icelandic __ ß = small sharp s, German __ à = small a, grave accent __ á = small a, acute accent __ â = small a, circumflex accent __ ã = small a, tilde __ ä = small a, umlaut mark __ å = small a, ring __ æ = small ae __ ç = small c, cedilla __ è = small e, grave accent __ é = small e, acute accent __ ê = small e, circumflex accent __ ë = small e, umlaut mark __ ì = small i, grave accent __ í = small i, acute accent __ î = small i, circumflex accent __ ï = small i, umlaut mark __ ð = small eth, Icelandic __ ñ = small n, tilde __ ò = small o, grave accent __ ó = small o, acute accent __ ô = small o, circumflex accent __ õ = small o, tilde __ ö = small o, umlaut mark __ ø = small o, slash __ ù = small u, grave accent __ ú = small u, acute accent __ û = small u, circumflex accent __ ü = small u, umlaut mark __ ý = small y, acute accent __ þ = small thorn, Icelandic __ ÿ = small y, umlaut mark"; var enc = encodeURI(uri); var dec = decodeURI(enc); var res = dec; document.getElementById("demo").innerHTML = res; } </script> </body> </html>
sumber