Estoy trabajando en un CMS que permite a los usuarios ingresar contenido. El problema es que cuando agregan símbolos ®
, es posible que no se muestren bien en todos los navegadores. Me gustaría configurar una lista de símbolos que se deben buscar y luego convertir a la entidad html correspondiente. Por ejemplo
® => ®
& => &
© => ©
™ =>™
Después de la conversión, debe estar envuelto en una <sup>
etiqueta, lo que resulta en esto:
®
=> <sup>®</sup>
Debido a que es necesario un tamaño de fuente y un estilo de relleno particulares:
sup { font-size: 0.6em; padding-top: 0.2em; }
¿El JavaScript sería algo como esto?
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([?]);
}
Donde "[?]" Significa que hay algo de lo que no estoy seguro.
Detalles adicionales:
- Me gustaría hacer esto con JavaScript puro, no algo que requiera una biblioteca como jQuery, gracias.
- El backend es Ruby
- Usando RefineryCMS que está construido con Ruby on Rails
javascript
html
JGallardo
fuente
fuente
accept-charset="UTF-8"
a su<form>
etiqueta. En el servidor, querrá asegurarse de que su salida esté codificada en UTF-8 y que su servidor web le diga al navegador que lo está (a través delContent-Type
encabezado). Consulte rentzsch.tumblr.com/post/9133498042/… Si hace todo eso y un navegador no muestra el carácter correctamente, reemplazar el carácter con una entidad no haría ninguna diferencia.sup
elementos tiende a causar más problemas de los que podría resolver, ya que en muchas fuentes, “®” es pequeño y está en posición de subíndice, por lo que lo reduciría a irreconocible.<sup>
no es un problema, ya que he probado las fuentes específicas utilizadas para las publicaciones del blog, pero ese es un buen punto a considerar.Respuestas:
Puede usar expresiones regulares para reemplazar cualquier carácter en un rango Unicode dado con su entidad html equivalente. El código se vería así:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) { return '&#'+i.charCodeAt(0)+';'; });
Este código reemplazará todos los caracteres en el rango dado (unicode 00A0 - 9999, así como ampersand, mayor y menor que) con sus equivalentes de entidad html, que es simplemente de
&#nnn;
dóndennn
está el valor Unicode que obtenemoscharCodeAt
.Véalo en acción aquí: http://jsfiddle.net/E3EqX/13/ (este ejemplo usa jQuery para los selectores de elementos usados en el ejemplo. El código base en sí mismo, arriba, no usa jQuery)
Hacer estas conversiones no resuelve todos los problemas; asegúrese de utilizar la codificación de caracteres UTF8, asegúrese de que su base de datos esté almacenando las cadenas en UTF8. usted todavía puede ver casos en los que los caracteres no se muestran correctamente, dependiendo de la configuración de fuentes del sistema y otros problemas fuera de su control.
Documentación
String.charCodeAt
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAtfuente
.js
archivo y agregar las otras cosas para envolver con un<sup>
?sup
etiqueta (o cualquier otra etiqueta), y está contenida en una función: jsfiddle.net/E3EqX/4 . Para usar esto, necesita copiar la función "encodeAndWrap" a su proyecto.La respuesta actualmente aceptada tiene varios problemas. Esta publicación los explica y ofrece una solución más sólida. La solución sugerida en esa respuesta anteriormente tenía:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) { return '&#' + i.charCodeAt(0) + ';'; });
La
i
bandera es redundante ya que ningún símbolo Unicode en el rango de U + 00A0 a U + 9999 tiene una variante de mayúsculas / minúsculas que esté fuera de ese mismo rango.La
m
bandera es redundante porque^
o$
no se utilizan en la expresión regular.¿Por qué el rango U + 00A0 a U + 9999? Parece arbitrario.
De todos modos, para una solución que codifique correctamente todos los símbolos ASCII, excepto los seguros e imprimibles, en la entrada (¡incluidos los símbolos astrales!), E implemente todas las referencias de caracteres con nombre (no solo las de HTML4), use la biblioteca he (descargo de responsabilidad: esta biblioteca es mía ). De su archivo README:
También vea esta respuesta relevante de Stack Overflow .
fuente
Tuve el mismo problema y creé 2 funciones para crear entidades y traducirlas a caracteres normales. Los siguientes métodos traducen cualquier cadena a entidades HTML y vuelven al prototipo de cadena
/** * 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]); }) };
Luego puede usarlo de la siguiente manera:
var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en tést".toHtmlEntities(); console.log("Entities:", str); console.log("String:", String.fromHtmlEntities(str));
Salida en consola:
Entities: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést
fuente
m
modificador de patrón en un patrón que no tenga anclajes. ¿Quieres usarlos
para el patrón que contiene un punto?Sin ninguna biblioteca, si no necesita admitir IE <9, puede crear un elemento html y establecer su contenido con Node.textContent :
var str = "<this is not a tag>"; var p = document.createElement("p"); p.textContent = str; var converted = p.innerHTML;
Aquí hay un ejemplo: https://jsfiddle.net/1erdhehv/
fuente
Puedes usar esto.
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; } }); };
fuente
Si desea evitar codificar entidades html más de una 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)); }); }
# Ejemplo
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>
fuente
<#>
saldría como<#>
Caracteres especiales HTML y sus
ESCAPE CODES
Los caracteres reservados deben tener formato de escape HTML: podemos utilizar un carácter de escape para representar cualquier carácter Unicode [Ej: & - U + 00026] en HTML, XHTML o XML utilizando sólo caracteres ASCII. Referencias de caracteres numéricos [ Ej: ampersand (&) -
&
] & Referencias de caracteres con nombre [Ej:&
] son tipos decharacter escape used in markup
.Entidades predefinidas
Para mostrar etiquetas HTML como un formulario normal en una página web usamos
<pre>
,<code>
etiquetas o podemos escapar de ellas. Escapando de la cadena reemplazando con cualquier ocurrencia del"&"
carácter por la cadena"&"
y cualquier ocurrencia del">"
carácter por la cadena">"
. 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=""/>
fuente
m
contiene los caracteres especiales de una cadena 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); }
Una solución de matriz
fuente
Si ya está usando jQuery, intente
html()
.$('<div>').text('<script>alert("gotcha!")</script>').html() // "<script>alert("gotcha!")</script>"
Se crea una instancia de un nodo de texto en memoria y
html()
se llama en él.Es feo, desperdicia un poco de memoria y no tengo idea si es tan completo como algo como la
he
biblioteca, pero si ya está usando jQuery, tal vez esta sea una opción para usted.Tomado de la publicación del blog Codificar entidades HTML con jQuery por Felix Geisendörfer.
fuente
var converter=$("<div>");
y luego reutilizarlo:html1=converter.text(text1).html(); html2=converter.text(text2).html();
...A veces solo desea codificar todos los caracteres ... Esta función reemplaza "todo menos nada" en regxp.
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
Mostrar fragmento 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>
fuente
^
por una.
de emojis de conserva:function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
.Consulte el tutorial de Ourcodeworld Ourcodeworld: codifique y decodifique entidades html con javascript
Más importante aún, el ejemplo de la biblioteca
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 probablemente haría su codificación más fácil y mejor administrada. Es popular, se actualiza regularmente y sigue las especificaciones HTML. En sí mismo no tiene dependencias, como se puede ver en el package.json
fuente
Así es como implementé la codificación. Me inspiré en las respuestas dadas anteriormente.
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("<>"));
fuente
m
modificador de patrón en un patrón que no tiene anclajes.Puede utilizar el
charCodeAt()
método para comprobar si el carácter especificado tiene un valor superior a 127 y convertirlo en una referencia de carácter numérico utilizandotoString(16)
.fuente
127
y cómo / por qué funciona esto;)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; }
fuente
<!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>
fuente