Codificar entidades html en javascript

100

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>&reg;</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
JGallardo
fuente
¿Cuál es tu backend? Si es php, hay funciones que se encargan de esto por usted, y estoy seguro de que otros lenguajes también las tienen. Además, Google: developmentwithstyle.com/articles/2010/06/29/…
Chris Baker
5
Una mejor solución podría ser aceptar y generar texto codificado en UTF-8. Todos los navegadores que se utilizan actualmente son compatibles con UTF-8. En el lado HTML, querrá agregar 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 del Content-Typeencabezado). 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.
Paul D. Waite
@Chris trabajando en un CMS construido con Ruby on Rails.
JGallardo
Es incorrecto cambiar un carácter a una referencia de entidad HTML en JavaScript del lado del cliente, ya que JavaScript del lado del cliente opera en el DOM, donde las entidades no existen. Envolver “®” en supelementos 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.
Jukka K. Korpela
@ JukkaK.Korpela, así que teniendo en cuenta que necesito abordar que algunas entidades html no se mostrarán correctamente, ¿cómo lo abordaría? Y envolver <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.
JGallardo

Respuestas:

176

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ónde nnnestá el valor Unicode que obtenemos charCodeAt.

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

Chris Baker
fuente
Muchas gracias por el jsfiddle. Entonces para implementar esto. Puedo agregar esto a mi .jsarchivo y agregar las otras cosas para envolver con un <sup>?
JGallardo
2
@JGallardo Reescribí un poco el ejemplo para que agregue la supetiqueta (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.
Chris Baker
1
@Chris, gracias por el fragmento de código ordenado, aunque tiene un error: "[\ u00A0- \ u99999]" no hace lo que esperarías que hiciera, sino que equivale a "[\ u00A0- \ u9999] | 9 "- es decir. el carácter "9" también sería reemplazado erróneamente por una entidad HTML. También puedes probar eso en el violín. Sugeriré una solución para la respuesta.
SB
@SB Gracias por esa nota, incluso pude emitir el voto de aprobación final :)
Chris Baker
1
Aunque estoy de acuerdo en que la respuesta de @mathias Bynens es más completa, su solución es de 84KB, y eso me ha hecho seguir buscando una alternativa. Esto parece correcto, sin embargo, ¿podría uno incluir también charCodes <65, y entre> 90 && <97?
Florian Mertens
62

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 ibandera 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 mbandera 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:

él (para "entidades HTML") es un codificador / decodificador de entidad HTML robusto escrito en JavaScript. Admite todas las referencias de caracteres con nombre estandarizadas según HTML , maneja símbolos de unión ambiguos y otros casos extremos como lo haría un navegador , tiene un extenso conjunto de pruebas y, al contrario de muchas otras soluciones de JavaScript , maneja bien los símbolos Unicode astrales. Hay una demostración en línea disponible.

También vea esta respuesta relevante de Stack Overflow .

Mathias Bynens
fuente
12
Además, la biblioteca HE es ... ¡84KB! Autch ... Intenta descargarlo en un teléfono móvil a través de una conexión menor. Hay que llegar a un compromiso en alguna parte ..
Florian Mertens
1
Después de @FlorianMertens minifying + gzip que es de ~ 24 KB. Eso sigue siendo grande, pero al final del día, si desea decodificar entidades HTML correctamente, necesitará todos los datos sobre ellas, no hay forma de evitarlo. Si puede encontrar una manera de reducir el tamaño de la biblioteca sin afectar el rendimiento, envíe una solicitud de extracción.
Mathias Bynens
2
@MathiasBynens, sin duda su biblioteca es buena, pero puede usar el cuadro de comentarios para resaltar el problema en las respuestas aceptadas y envíe su respuesta mejorada en el bloque de código
diEcho
3
@drzaus Las imágenes pueden salirse con la suya porque almacenan una gran cantidad de datos, y los datos menos comprimidos son más rápidos de decodificar. Sin embargo, el código del programa es diferente, muy a menudo se agrega una biblioteca completa y se hace poco uso de ella. ¡El código de las bibliotecas a veces contiene más líneas que su propio código! Además, pocos se molestarán en encontrar / depurar problemas de bibliotecas y enviar informes de errores (o incluso actualizar la biblioteca), por lo que las pérdidas de memoria u otros problemas pueden persistir en el software con muchas bibliotecas con código no verificado. Si alguien solo quiere codificar / escapar de caracteres no seguros html, solo se necesitan unas pocas líneas, no 80kb.
bryc
1
@MarcoKlein Sí, lo explico en mi publicación. De hecho, es un problema que sufre el fragmento de código con errores. La solución que señalo no tiene ese problema. (ver "¡incluyendo símbolos astrales!")
Mathias Bynens
29

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: &#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
fuente
Esta solución también funciona en tvOS, por lo que puede resolver bien los problemas de codificación en todos los casos.
loretoparisi
4
¿No es un poco extremo? Estás convirtiendo todo a entidades HTML, incluso caracteres "seguros" como "abc", "123" ... incluso los espacios en blanco
AJPerez
1
Esta es una mala respuesta. Más del 50% de los documentos en la web contienen principalmente latin1 con algo de utf-8. Su codificación de caracteres seguros aumentará su tamaño entre un 500% y un 600%, sin ninguna ventaja.
HoldOffHunger
Explique el propósito del mmodificador de patrón en un patrón que no tenga anclajes. ¿Quieres usarlo spara el patrón que contiene un punto?
mickmackusa
19

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/

antoineMoPa
fuente
2
¿Por qué no usar innerText en lugar de textContent?
Rick
@Rick, dale una oportunidad al documento MDN para textContent vinculado en la respuesta. Citando "textContent y HTMLElement.innerText se confunden fácilmente, pero las dos propiedades son diferentes en aspectos importantes ".
Adarsha
17

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;
        }
    });
};
Takdeniz
fuente
4
Es probable que agregar manualmente un subconjunto aleatorio de caracteres codificables genere problemas para usted y sus colegas en el futuro. Debe haber una sola autoridad para la cual los caracteres deben codificarse, probablemente el navegador o, en su defecto, una biblioteca específica que probablemente sea completa y se mantenga.
user234461
Buen punto, @ user234461. Si alguien encuentra esa única autoridad, a las mentes inquisitivas (como yo) les encantaría saberlo.
idungotnosn
7

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 &#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
fuente
Esto solo es útil si tiene un texto mezclado parcialmente escapado para empezar, e introduce errores ya que no puede codificar correctamente todas las cadenas: <#>saldría como<#&#62;
Rick
@Rick Gracias por avisarme sobre eso, he actualizado mi respuesta para mejorarla.
StefansArya
4

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 (&) - &#38;] & Referencias de caracteres con nombre [Ej: &amp;] son ​​tipos de character escape used in markup.


Entidades predefinidas

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

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 "&amp;"y cualquier ocurrencia del ">"carácter por la cadena "&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
fuente
Esto es excelente para agregar código fuente html en formato Json en la cadena iframe srcdoc.
Nime Cloud
Esto no incluye ®, por lo que no ayudará al OP. Además, este JS es mucho más complicado que muchas de las otras soluciones, incluso las que solo usan un mapeo corto como este. swapJsonKeyValues ​​tiene un nombre deficiente ya que ha requerido efectos secundarios (definición de mapkeys y mapvalues)
Rick
@mickmackusa He actualizado la publicación con los valores de depuración. mcontiene los caracteres especiales de una cadena de entrada.
Yash
Si hay algún error en la publicación. Por lo tanto, intente corregir la publicación y proporcione los comentarios.
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);
}

Una solución de matriz

Cesar De la Cruz
fuente
3
Explique cómo esto resuelve el problema de una manera única y mejor que la anterior. A simple vista, parecería que esta solución es más lenta porque modifica la cadena en varias pasadas en lugar de todas a la vez. Sin embargo, puedo estar equivocado. De cualquier manera, debes hacer una copia de seguridad de tu publicación con una explicación.
Jack Giffin
Es una alternativa, puede usar expresiones regulares directamente desde la matriz ...: D
Cesar De la Cruz
Esta es una expresión regular para cada carácter (para v en ....). Si quisiera cubrir todo UTF-8, esto sería 65,000 expresiones regulares y 65,000 líneas de ejecución.
HoldOffHunger
2
Solo estoy interesado en convertir tres caracteres en entidades, por lo que esta respuesta es mejor en mi caso y me alegro de que estuviera aquí
Drew
2

Si ya está usando jQuery, intente html().

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

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 hebiblioteca, 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.

Jared Beck
fuente
3
Para evitar crear una instancia de un nodo cada vez, puede guardar el nodo: var converter=$("<div>");y luego reutilizarlo: html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM
1

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

Dave Brown
fuente
1
Reemplazar el ^por una .de emojis de conserva: function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}.
Swiss Mister
1

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 &#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'

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

jking
fuente
OP pidió vainilla JS y vainilla JS ofrece element.innerText. Si hay una ventaja para la biblioteca, agréguela a su respuesta.
Rick
0

Así es como implementé la codificación. Me inspiré en las respuestas dadas anteriormente.

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
fuente
descansos para cualquier entrada en \ u00A0- \ u9999 que no esté en su lista
Rick
Explique el propósito del mmodificador de patrón en un patrón que no tiene anclajes.
mickmackusa
-1

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 utilizando toString(16).

bolistene
fuente
4
Sería bueno si pudiera agregar un poco sobre el número mágico 127y cómo / por qué funciona esto;)
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
fuente
-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
fuente
Esto no parece responder a la pregunta y es una respuesta de solo código. Proporcione una descripción de lo que hace el código y cómo se relaciona con la pregunta.
Rick