Estou trabalhando em um CMS que permite aos usuários inserir conteúdo. O problema é que quando eles adicionam símbolos ®
, eles podem não ser exibidos bem em todos os navegadores. Eu gostaria de criar uma lista de símbolos que devem ser pesquisados e, em seguida, convertidos para a entidade html correspondente. Por exemplo
® => ®
& => &
© => ©
™ =>™
Após a conversão, ele precisa ser embalado em uma <sup>
tag, resultando em:
®
=> <sup>®</sup>
Como um tamanho de fonte e estilo de preenchimento específicos são necessários:
sup { font-size: 0.6em; padding-top: 0.2em; }
O JavaScript seria algo assim?
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([?]);
}
Onde "[?]" Significa que há algo sobre o qual não tenho certeza.
Detalhes adicionais:
- Eu gostaria de fazer isso com JavaScript puro, não algo que requer uma biblioteca como o jQuery, obrigado.
- Backend é Ruby
- Usando RefineryCMS, que é construído com Ruby on Rails
javascript
html
JGallardo
fonte
fonte
accept-charset="UTF-8"
à sua<form>
tag. No servidor, você quer ter certeza de que sua saída é codificada em UTF-8 e que seu servidor da web informa ao navegador que é (por meio doContent-Type
cabeçalho). Veja rentzsch.tumblr.com/post/9133498042/… Se você fizer tudo isso, e um navegador não exibir o caractere corretamente, substituir o caractere por uma entidade não faria nenhuma diferença.sup
elementos tende a causar mais problemas do que poderia resolver, uma vez que em muitas fontes, “®” é pequeno e na posição subscrita, então você o reduziria a irreconhecível.<sup>
não é um problema, já que testei as fontes específicas usadas nas postagens do blog, mas esse é um bom ponto a se considerar.Respostas:
Você pode usar regex para substituir qualquer caractere em um determinado intervalo Unicode por seu equivalente de entidade html. O código seria mais ou menos assim:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) { return '&#'+i.charCodeAt(0)+';'; });
Este código substituirá todos os caracteres no intervalo fornecido (unicode 00A0 - 9999, bem como e comercial, maior e menor que) por seus equivalentes de entidade html, que é simplesmente de
&#nnn;
ondennn
está o valor Unicode que obtemoscharCodeAt
.Veja em ação aqui: http://jsfiddle.net/E3EqX/13/ (este exemplo usa jQuery para seletores de elemento usados no exemplo. O próprio código base, acima, não usa jQuery)
Fazer essas conversões não resolve todos os problemas - certifique-se de usar a codificação de caracteres UTF8, certifique-se de que seu banco de dados está armazenando as strings em UTF8. Você ainda pode ver casos em que os caracteres não são exibidos corretamente, dependendo da configuração da fonte do sistema e de outros problemas fora do seu controle.
Documentação
String.charCodeAt
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAtfonte
.js
arquivo e adicionar as outras coisas para embrulhar com um<sup>
?sup
tag (ou qualquer outra tag), e ele está contido em uma função: jsfiddle.net/E3EqX/4 . Para usar isso, você precisa copiar a função "encodeAndWrap" para o seu projeto.A resposta aceita atualmente tem vários problemas. Este post os explica e oferece uma solução mais robusta. A solução sugerida nessa resposta anteriormente tinha:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) { return '&#' + i.charCodeAt(0) + ';'; });
O
i
sinalizador é redundante, pois nenhum símbolo Unicode no intervalo de U + 00A0 a U + 9999 tem uma variante em maiúsculas / minúsculas que esteja fora desse mesmo intervalo.O
m
sinalizador é redundante porque^
ou$
não é usado na expressão regular.Por que o intervalo U + 00A0 a U + 9999? Parece arbitrário.
De qualquer forma, para uma solução que codifica corretamente todos, exceto os símbolos ASCII seguros e imprimíveis na entrada (incluindo símbolos astrais!) E implementa todas as referências de caracteres nomeados (não apenas aqueles em HTML4), use a biblioteca he (isenção de responsabilidade: esta biblioteca é minha ) De seu README:
Veja também esta resposta relevante do Stack Overflow .
fonte
Eu tive o mesmo problema e criei 2 funções para criar entidades e traduzi-las de volta para caracteres normais. Os métodos a seguir traduzem qualquer string em entidades HTML e de volta ao protótipo 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]); }) };
Você pode então usá-lo da seguinte forma:
var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en tést".toHtmlEntities(); console.log("Entities:", str); console.log("String:", String.fromHtmlEntities(str));
Saída no console:
Entities: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést
fonte
m
modificador de padrão em um padrão sem âncoras. Então você pretende usars
para o padrão que contém um ponto?Sem qualquer biblioteca, se você não precisar oferecer suporte ao IE <9, poderá criar um elemento html e definir seu conteúdo com Node.textContent :
var str = "<this is not a tag>"; var p = document.createElement("p"); p.textContent = str; var converted = p.innerHTML;
Aqui está um exemplo: https://jsfiddle.net/1erdhehv/
Atualizar: Isso só funciona para entidades de tag HTML (&, <e>).
fonte
Você pode usar isso.
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; } }); };
fonte
”
ü
š
etc. A lista abrangente de todas as entidades html é bastante longa: freeformatter.com/html-entities.htmlSe você quiser evitar codificar entidades html mais de uma vez
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)); }); }
# Exemplo
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>
fonte
<#>
sairia como<#>
Caracteres especiais HTML e seus
ESCAPE CODES
Os caracteres reservados devem ser escapados por HTML: Podemos usar um escape de caractere para representar qualquer caractere Unicode [Ex: & - U + 00026] em HTML, XHTML ou XML usando apenas caracteres ASCII. Referências de caracteres numéricos [ Ex: e comercial (&) -
&
] & Referências de caracteres nomeados [Ex:&
] são tipos decharacter escape used in markup
.Entidades Predefinidas
Para exibir marcas HTML como uma forma normal na página web que usamos
<pre>
,<code>
marcas ou podemos escapar deles. Escapar da string substituindo qualquer ocorrência do"&"
caractere pela string"&"
e quaisquer ocorrências do">"
caractere pela 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=""/>
fonte
m
contém os caracteres especiais de uma string de entrada.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); }
Uma solução de array
fonte
Se você já estiver usando jQuery, tente
html()
.$('<div>').text('<script>alert("gotcha!")</script>').html() // "<script>alert("gotcha!")</script>"
Um nó de texto na memória é instanciado e
html()
chamado nele.É feio, desperdiça um pouco de memória e não tenho ideia se é tão completo quanto algo como a
he
biblioteca, mas se você já estiver usando jQuery, talvez esta seja uma opção para você.Retirado da postagem do blog Codifique entidades HTML com jQuery por Felix Geisendörfer.
fonte
var converter=$("<div>");
e depois reutilizá-lo:html1=converter.text(text1).html(); html2=converter.text(text2).html();
...Às vezes, você só deseja codificar cada caractere ... Esta função substitui "tudo menos nada" no regxp.
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
Exibir trecho de código
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>
fonte
^
por um.
de emojis conserva:function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
.Confira o tutorial de Ourcodeworld Ourcodeworld - codifique e decodifique entidades html com javascript
Mais importante ainda, o exemplo da biblioteca 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'
Esta biblioteca provavelmente tornaria sua codificação mais fácil e melhor gerenciada. É popular, atualizado regularmente e segue as especificações HTML. Ele em si não tem dependências, como pode ser visto no package.json
fonte
Aqui está como implementei a codificação. Eu me inspirei nas respostas dadas acima.
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("<>"));
fonte
m
modificador de padrão em um padrão sem âncoras.uma das maneiras fáceis de codificar ou decodificar entidades HTML,
basta chamar uma função com um argumento ...
Decodificar entidades HTML
function decodeHTMLEntities(text) { var textArea = document.createElement('textarea'); textArea.innerHTML = text; return textArea.value; }
Decodificar entidades HTML (JQuery)
function decodeHTMLEntities(text) { return $("<textarea/>").html(text).text(); }
Codificar entidades HTML
function encodeHTMLEntities(text) { var textArea = document.createElement('textarea'); textArea.innerText = text; return textArea.innerHTML; }
Codificar entidades HTML (JQuery)
function encodeHTMLEntities(text) { return $("<textarea/>").text(text).html(); }
fonte
Você pode usar o
charCodeAt()
método para verificar se o caractere especificado tem um valor superior a 127 e convertê-lo em uma referência de caractere numérico usandotoString(16)
.fonte
127
e como / por que isso funciona;)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; }
fonte
<!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>
fonte