Codificar entidades html em javascript

108

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>&reg;</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
JGallardo
fonte
Qual é o seu back-end? Se for php, existem funções para cuidar disso para você, e tenho certeza de que outras linguagens também as têm. Além disso, Google: developerswithstyle.com/articles/2010/06/29/…
Chris Baker
5
Uma solução melhor pode ser aceitar e produzir texto codificado em UTF-8. Todos os navegadores em uso hoje oferecem suporte a UTF-8. No lado do HTML, você deseja adicionar 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 do Content-Typecabeç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.
Paul D. Waite
@Chris trabalhando em um CMS construído com Ruby on Rails.
JGallardo
É errado alterar um caractere para uma referência de entidade HTML em JavaScript do lado do cliente, uma vez que o JavaScript do lado do cliente opera no DOM, onde entidades não existem. Envolvendo “®” emsup 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.
Jukka K. Korpela
@ JukkaK.Korpela, considerando que preciso abordar que algumas entidades html não serão exibidas corretamente, como você trataria disso? E envolver <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.
JGallardo

Respostas:

180

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;onde nnnestá o valor Unicode que obtemos charCodeAt.

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

Chris Baker
fonte
Muito obrigado pelo jsfiddle. Então, para implementar isso. Posso apenas adicionar isso ao meu .jsarquivo e adicionar as outras coisas para embrulhar com um <sup>?
JGallardo
2
@JGallardo Eu reescrevi um pouco o exemplo para adicionar a suptag (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.
Chris Baker
1
@Chris obrigado pelo trecho de código bacana, embora tenha um bug: "[\ u00A0- \ u99999]" não faz o que você esperava que fizesse, mas é igual a "[\ u00A0- \ u9999] | 9 "- ou seja, o caractere "9" também seria erroneamente substituído por uma entidade HTML. Você pode tentar isso no violino também. Vou sugerir uma correção para a resposta.
SB de
@SB Obrigado por essa nota, eu até pude lançar o voto de aprovação final :)
Chris Baker
1
Embora eu concorde que a resposta de @mathias Bynens seja mais completa, sua solução é de 84KB, e isso me fez continuar procurando uma alternativa. Isso parece OK-ish, no entanto, também poderia incluir charCodes <65, e entre> 90 && <97?
Florian Mertens
63

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 isinalizador é 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 msinalizador é 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:

ele (para "entidades HTML") é um codificador / decodificador de entidade HTML robusto escrito em JavaScript. Ele suporta todas as referências de caracteres nomeados padronizados como por HTML , lida com ampersands ambíguos e outros casos extremos como um navegador faria , tem um amplo conjunto de testes e - ao contrário de muitas outras soluções JavaScript - ele lida perfeitamente com símbolos Unicode astrais. Uma demonstração online está disponível.

Veja também esta resposta relevante do Stack Overflow .

Mathias Bynens
fonte
12
Além disso, a biblioteca HE tem ... 84 KB! Autch ... Tente fazer o download em um telefone celular com uma conexão inferior. Um compromisso deve ser feito em algum lugar ..
Florian Mertens
1
@FlorianMertens Depois de minimizar + gzip, ele tem ~ 24 KB. Isso ainda é grande, mas no final do dia, se você quiser decodificar entidades HTML corretamente, você precisará de todos os dados nelas - não há como evitar. Se você encontrar uma maneira de tornar a biblioteca menor sem afetar o desempenho, envie uma solicitação de pull.
Mathias Bynens
2
@MathiasBynens, sem dúvida sua biblioteca é boa, mas você pode usar a caixa de comentários para destacar o problema nas respostas aceitas e enviar sua resposta melhorada no bloco de código
diEcho
3
@drzaus As imagens podem ficar grandes porque armazenam muitos dados, e menos dados compactados são mais rápidos de decodificar. No entanto, o código do programa é diferente, muitas vezes uma biblioteca inteira é adicionada e pouco uso é feito dela. O código das bibliotecas às vezes contém mais linhas do que seu próprio código! Além disso, poucos se preocuparão em encontrar / depurar problemas de lib e enviar relatórios de erros (ou até mesmo atualizar a lib), portanto, vazamentos de memória ou outros problemas podem persistir em software com muitas libs com código não verificado. Se alguém quiser apenas codificar / escapar de caracteres html não seguros, apenas algumas linhas são necessárias, não 80kb.
bryc
1
@MarcoKlein Sim, eu explico isso no meu post. É realmente um problema que causa o fragmento de código com erros. A solução que aponto não tem esse problema. (veja "incluindo símbolos astrais!")
Mathias Bynens
29

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: &#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
fonte
Esta solução também funciona no tvOS, por isso pode resolver bem os problemas de codificação em todos os casos.
Loretoparisi
4
Isso não é um pouco extremo? Você está convertendo tudo em entidades HTML, até mesmo caracteres "seguros" como "abc", "123" ... até mesmo os espaços em branco
AJPerez
1
Esta é uma resposta ruim. Mais de 50% dos documentos na web contêm principalmente latin1 com algum utf-8. Sua codificação de caracteres seguros aumentará seu tamanho em 500% a 600%, sem nenhuma vantagem.
HoldOffHunger
Explique a finalidade do mmodificador de padrão em um padrão sem âncoras. Então você pretende usar spara o padrão que contém um ponto?
mickmackusa de
20

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>).

antoineMoPa
fonte
2
Por que não usar innerText em vez de textContent?
Rick
@Rick, dê uma chance ao documento MDN para textContent vinculado à resposta. Citando-o "textContent e HTMLElement.innerText são facilmente confundidos, mas as duas propriedades são diferentes em aspectos importantes ."
Adarsha
Esta seria uma ótima solução, mas não codifica o caractere "corretamente.
Andreas
Você está certo. Parece que esta solução pode funcionar apenas para caracteres de tag html (<,>, /). Estou tentado a removê-lo.
antoineMoPa
19

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;
        }
    });
};
Takdeniz
fonte
4
Adicionar manualmente um subconjunto aleatório de caracteres codificáveis ​​provavelmente criará problemas para você e seus colegas no futuro. Deve haver uma única autoridade para a qual os caracteres devem ser codificados, provavelmente o navegador ou, na falta, uma biblioteca específica que provavelmente será abrangente e mantida.
user234461
1
Ótimo ponto, @ user234461. Se alguém encontrar essa autoridade única, mentes questionadoras (como eu) adorariam saber!
idungotnosn
1
Isso vai perder muitas entidades html, sunch, &rdquo; &uuml; &scaron;etc. A lista abrangente de todas as entidades html é bastante longa: freeformatter.com/html-entities.html
lofihelsinki
7

Se 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 &#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
fonte
Isso só é útil se você tiver um texto parcialmente escapado misto para começar e apresenta bugs, pois não pode codificar adequadamente todas as strings: <#>sairia como<#&#62;
Rick
@Rick Obrigado por me notificar sobre isso, eu atualizei minha resposta para torná-la mais melhor.
StefansArya
4

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 (&) - &#38;] & Referências de caracteres nomeados [Ex: &amp;] são 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 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 "&amp;"e quaisquer ocorrências do ">"caractere pela string "&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
fonte
Isso é ótimo para adicionar código-fonte html no formato Json na string srcdoc do iframe.
Nime Cloud
Isso não inclui ®, então não vai ajudar o OP. Além disso, este JS é muito mais complicado do que muitas das outras soluções, mesmo aquelas que usam apenas um mapeamento curto como este. swapJsonKeyValues ​​é mal nomeado porque tem efeitos colaterais necessários (definindo mapkeys e mapvalues)
Rick,
@mickmackusa Eu atualizei o post com os valores de depuração. mcontém os caracteres especiais de uma string de entrada.
Yash
Se houver algum erro na postagem. Portanto, tente corrigir a postagem e fornecer os comentários.
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);
}

Uma solução de array

Cesar De la Cruz
fonte
3
Explique como isso resolve o problema de uma maneira única e melhor do que acima. À primeira vista, pode parecer que essa solução é mais lenta porque modifica a string em várias passagens, em vez de todas de uma vez. No entanto, posso estar incorreto. De qualquer forma, você deve fazer backup de sua postagem com uma explicação.
Jack Giffin
É uma alternativa, você pode usar regex diretamente da matriz ...: D
Cesar De la Cruz
Este é um regex para cada caractere (para v em ....). Se você quisesse cobrir todo o UTF-8, seriam 65.000 regexs e 65.000 linhas de execução.
HoldOffHunger
2
Só estou interessado em converter três caracteres em entidades, então esta resposta é melhor no meu caso e estou feliz por ter vindo aqui
Drew
2

Se você já estiver usando jQuery, tente html().

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

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

Jared Beck
fonte
3
Para evitar a instanciação de um nó todas as vezes, você pode salvar o nó: var converter=$("<div>");e depois reutilizá-lo: html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM
1

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

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

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

brincadeira
fonte
OP pediu vanilla JS e vanilla JS oferece element.innerText. Se houver uma vantagem para a biblioteca, adicione-a à sua resposta.
Rick de
0

Aqui está como implementei a codificação. Eu me inspirei nas respostas dadas acima.

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
fonte
pausas para qualquer entrada em \ u00A0- \ u9999 que não esteja na sua lista
Rick,
Explique a finalidade do mmodificador de padrão em um padrão sem âncoras.
mickmackusa de
0

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();
}
Harsh Patel
fonte
-1

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

bolisteno
fonte
4
Seria bom se você pudesse acrescentar um pouco sobre o número mágico 127e como / por que isso funciona;)
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
fonte
-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
fonte
Isso não parece responder à pergunta e é uma resposta apenas em código. Forneça uma descrição do que o código está fazendo e como se relaciona com a pergunta.
Rick de