Pracuję w systemie CMS, który umożliwia użytkownikom wprowadzanie treści. Problem polega na tym, że kiedy dodają symbole ®
, może nie wyświetlać się dobrze we wszystkich przeglądarkach. Chciałbym ustawić listę symboli, które należy wyszukać, a następnie przekonwertować na odpowiednią jednostkę html. Na przykład
® => ®
& => &
© => ©
™ =>™
Po konwersji należy go owinąć <sup>
tagiem, w wyniku czego:
®
=> <sup>®</sup>
Ponieważ wymagany jest określony rozmiar czcionki i styl dopełnienia:
sup { font-size: 0.6em; padding-top: 0.2em; }
Czy JavaScript wyglądałby podobnie?
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([?]);
}
Gdzie „[?]” Oznacza, że jest coś, czego nie jestem pewien.
Dodatkowe Szczegóły:
- Chciałbym to zrobić za pomocą czystego JavaScript, a nie czegoś, co wymaga biblioteki takiej jak jQuery, dzięki.
- Backend to Ruby
- Korzystanie z RefineryCMS, który jest zbudowany w Ruby on Rails
javascript
html
JGallardo
źródło
źródło
accept-charset="UTF-8"
do swojego<form>
tagu. Na serwerze chciałbyś upewnić się, że twoje dane wyjściowe są zakodowane w UTF-8 i że twój serwer sieciowy informuje przeglądarkę, że tak jest (poprzezContent-Type
nagłówek). Zobacz rentzsch.tumblr.com/post/9133498042/… Jeśli zrobisz to wszystko, a przeglądarka nie wyświetla poprawnie znaku, to zastąpienie znaku bytem nie miałoby żadnego znaczenia.sup
elementów powoduje zwykle więcej problemów, niż mogłoby to rozwiązać, ponieważ w wielu czcionkach znak „®” jest mały i znajduje się w indeksie dolnym, więc można go zredukować do nierozpoznawalnego.<sup>
nie stanowi problemu, ponieważ przetestowałem określone czcionki używane w postach na blogu, ale warto to rozważyć.Odpowiedzi:
Możesz użyć wyrażenia regularnego, aby zastąpić dowolny znak w danym zakresie Unicode jego odpowiednikiem encji html. Kod wyglądałby mniej więcej tak:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) { return '&#'+i.charCodeAt(0)+';'; });
Ten kod zastąpi wszystkie znaki w podanym zakresie (unicode 00A0 - 9999, a także ampersand, większe i mniejsze niż) ich odpowiednikami encji html, czyli po prostu
&#nnn;
skądnnn
pochodzi wartość Unicode, z której otrzymujemycharCodeAt
.Zobacz to w akcji tutaj: http://jsfiddle.net/E3EqX/13/ (ten przykład używa jQuery dla selektorów elementów użytych w przykładzie. Sam kod bazowy powyżej nie używa jQuery)
Wykonanie tych konwersji nie rozwiązuje wszystkich problemów - upewnij się, że używasz kodowania znaków UTF8, upewnij się, że Twoja baza danych przechowuje ciągi znaków w UTF8. Państwo nadal mogą zobaczyć przypadki, w których znaki nie są wyświetlane prawidłowo, w zależności od konfiguracji systemu czcionek i innych kwestii poza kontrolą.
Dokumentacja
String.charCodeAt
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAtźródło
.js
pliku i dodać inne rzeczy do owinięcia<sup>
?sup
tag (lub inny tag) i jest zawarty w funkcji: jsfiddle.net/E3EqX/4 . Aby z tego skorzystać, musisz skopiować funkcję „encodeAndWrap” do swojego projektu.Aktualnie zaakceptowana odpowiedź ma kilka problemów. Ten post wyjaśnia je i oferuje solidniejsze rozwiązanie. Rozwiązanie sugerowane w tej odpowiedzi miało:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) { return '&#' + i.charCodeAt(0) + ';'; });
i
Flaga jest zbędny, ponieważ brak symbolu Unicode w zakresie od U + 00A0 do U + 9999 ma wielkie / małe litery wariant, który jest poza tym samym zakresie.m
Flaga jest zbędny, ponieważ^
albo$
nie są stosowane w wyrażeniu regularnym.Dlaczego zakres od U + 00A0 do U + 9999? Wydaje się arbitralne.
W każdym razie, aby uzyskać rozwiązanie, które poprawnie koduje wszystkie z wyjątkiem bezpiecznych i drukowalnych symboli ASCII na wejściu (w tym symbole astralne!) I implementuje wszystkie nazwane odwołania do znaków (nie tylko te w HTML4), użyj biblioteki he (zastrzeżenie: ta biblioteka jest moja ). Z README:
Zobacz także tę odpowiednią odpowiedź dotyczącą przepełnienia stosu .
źródło
Miałem ten sam problem i stworzyłem 2 funkcje do tworzenia bytów i tłumaczenia ich z powrotem na normalne postacie. Poniższe metody tłumaczą dowolny ciąg na encje HTML iz powrotem na prototyp ciągu
/** * 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]); }) };
Możesz go następnie użyć w następujący sposób:
var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en tést".toHtmlEntities(); console.log("Entities:", str); console.log("String:", String.fromHtmlEntities(str));
Wyjście w konsoli:
Entities: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést
źródło
m
modyfikatora wzorca we wzorcu, który nie ma kotwic. Więc masz na myśli użycies
wzoru zawierającego kropkę?Bez żadnej biblioteki, jeśli nie potrzebujesz obsługi IE <9, możesz stworzyć element html i ustawić jego zawartość za pomocą Node.textContent :
var str = "<this is not a tag>"; var p = document.createElement("p"); p.textContent = str; var converted = p.innerHTML;
Oto przykład: https://jsfiddle.net/1erdhehv/
Aktualizacja: działa tylko dla encji znaczników HTML (&, <i>).
źródło
Możesz tego użyć.
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; } }); };
źródło
”
ü
š
itp. Lista wszystkich encji html jest dość długa: freeformatter.com/html-entities.htmlJeśli chcesz uniknąć kodowania jednostek HTML więcej niż jeden raz
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)); }); }
# Przykład
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>
źródło
<#>
wyjdzie jako<#>
Znaki specjalne HTML i jego
ESCAPE CODES
Zastrzeżone znaki muszą być chronione kodem HTML: możemy użyć znaku ucieczki, aby przedstawić dowolny znak Unicode [np: & - U + 00026] w HTML, XHTML lub XML, używając tylko znaków ASCII. Odniesienia do znaków numerycznych [ np. Ampersand (&) -
&
] i Odniesienia do nazwanych znaków [np.:&
] To typycharacter escape used in markup
.Elementy predefiniowane
Aby wyświetlić znaczniki HTML jako normalny w postaci strony internetowej używamy
<pre>
,<code>
tagi czy możemy im uciec. Zmiana znaczenia dla ciągu znaków poprzez zastąpienie dowolnego wystąpienia"&"
znaku w ciągu"&"
i wszelkich wystąpień">"
znaku w ciągu">"
. Dawny: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=""/>
źródło
m
przechowuje znaki specjalne wejściowego ciągu znaków.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); }
Rozwiązanie macierzowe
źródło
Jeśli już używasz jQuery, spróbuj
html()
.$('<div>').text('<script>alert("gotcha!")</script>').html() // "<script>alert("gotcha!")</script>"
Tworzona jest instancja węzła tekstowego w pamięci i
html()
jest na nim wywoływana.Jest brzydki, marnuje trochę pamięci i nie mam pojęcia, czy jest tak dokładny, jak coś w rodzaju
he
biblioteki, ale jeśli już używasz jQuery, może to jest opcja dla Ciebie.Zaczerpnięte z wpisu na blogu Koduj encje HTML za pomocą jQuery autorstwa Felixa Geisendörfera.
źródło
var converter=$("<div>");
a później użyć go ponownie:html1=converter.text(text1).html(); html2=converter.text(text2).html();
...Czasami chcesz po prostu zakodować każdy znak ... Ta funkcja zastępuje „wszystko, ale nic” w regxp.
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
Pokaż fragment kodu
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>
źródło
^
przez.
do emotikony konserwowa:function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
.Sprawdź samouczek z Ourcodeworld Ourcodeworld - kodowanie i dekodowanie encji HTML za pomocą javascript
Co najważniejsze, przykład biblioteki 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'
Ta biblioteka prawdopodobnie ułatwiłaby kodowanie i lepiej zarządzałaby nim. Jest popularny, regularnie aktualizowany i zgodny ze specyfikacją HTML. Samo w sobie nie ma żadnych zależności, co widać w pliku package.json
źródło
Oto jak zaimplementowałem kodowanie. Inspirację zaczerpnąłem z odpowiedzi udzielonych powyżej.
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("<>"));
źródło
m
modyfikatora wzorca we wzorcu, który nie ma kotwic.jeden z łatwych sposobów kodowania lub dekodowania jednostek HTML
po prostu Wywołanie funkcji z jednym argumentem ...
Dekoduj encje HTML
function decodeHTMLEntities(text) { var textArea = document.createElement('textarea'); textArea.innerHTML = text; return textArea.value; }
Dekoduj encje HTML (JQuery)
function decodeHTMLEntities(text) { return $("<textarea/>").html(text).text(); }
Koduj encje HTML
function encodeHTMLEntities(text) { var textArea = document.createElement('textarea'); textArea.innerText = text; return textArea.innerHTML; }
Koduj encje HTML (JQuery)
function encodeHTMLEntities(text) { return $("<textarea/>").text(text).html(); }
źródło
Możesz użyć tej
charCodeAt()
metody, aby sprawdzić, czy określony znak ma wartość większą niż 127 i przekonwertować go na numeryczne odwołanie do znaku za pomocątoString(16)
.źródło
127
i jak / dlaczego to działa;)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; }
źródło
<!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>
źródło