HTML-entiteit decoderen

Hoe codeer en decodeer ik HTML-entiteiten met JavaScript of JQuery?

var varTitle = "Chris' corner";

Ik wil dat het is:

var varTitle = "Chris' corner";

Antwoord 1, autoriteit 100%

Je zou iets kunnen proberen als:

var Title = $('<textarea />').html("Chris&apos; corner").text();
console.log(Title);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Antwoord 2, autoriteit 95%

Ik raad af om de jQuery-code te gebruiken die als antwoord is geaccepteerd. Hoewel het de te decoderen string niet in de pagina invoegt, zorgt het er wel voor dat dingen zoals scripts en HTML-elementen worden gemaakt. Dit is veel meer code dan we nodig hebben. In plaats daarvan raad ik aan om een veiligere, meer geoptimaliseerde functie te gebruiken.

var decodeEntities = (function() {
  // this prevents any overhead from creating the object each time
  var element = document.createElement('div');
  function decodeHTMLEntities (str) {
    if(str && typeof str === 'string') {
      // strip script/html tags
      str = str.replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, '');
      str = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, '');
      element.innerHTML = str;
      str = element.textContent;
      element.textContent = '';
    }
    return str;
  }
  return decodeHTMLEntities;
})();

http://jsfiddle.net/lytec/4/

Om deze functie te gebruiken, bel dan gewoon decodeEntities("&amp;")en het zal dezelfde onderliggende technieken gebruiken als de jQuery-versie-versie, maar zonder jQuery’s overhead, en na het ontsmetten van de HTML Tags in de invoer. Zie Mike Samuel’s commentaar op het geaccepteerde antwoord voor hoe te filteren uit HTML-tags.

Deze functie kan eenvoudig worden gebruikt als een jQuery-plug-in door de volgende regel in uw project toe te voegen.

jQuery.decodeEntities = decodeEntities;

3, Autoriteit 46%

Zoals Robert K zei, gebruik geen jQuery.html (). Tekst () om HTML-entiteiten te decoderen, omdat het onveilig is omdat gebruikersinvoer nooit toegang tot de DOM moet hebben. Lees meer over xss voor waarom dit onveilig is.

Probeer in plaats daarvan de underscore.js utility-riembibliotheek die wordt geleverd met Escape en unescape methoden:

_. Escape (string)

Ontsnapt op een tekenreeks voor insertie in HTML, vervanging van &, <, >, ", `en 'tekens.

_.escape('Curly, Larry & Moe');
=> "Curly, Larry &amp; Moe"

_. UNESCEP (string)

Het tegenovergestelde van Escape, vervangt &amp;, &lt;, &gt;, &quot;, &#96;en &#x27;met hun ongeculaire tegenhangers.

_.unescape('Curly, Larry &amp; Moe');
=> "Curly, Larry & Moe"

Om het decoderen van meer tekens te ondersteunen, kopieert u gewoon de underscore Unescape -methode en voeg meer tekens toe aan de kaart .


4, Autoriteit 21%

Oorspronkelijke auteur Antwoord hier .

Dit is mijn favoriete manier om HTML-tekens te decoderen. Het voordeel van het gebruik van deze code is dat tags ook worden bewaard.

function decodeHtml(html) {
    var txt = document.createElement("textarea");
    txt.innerHTML = html;
    return txt.value;
}

Voorbeeld: http://jsfiddle.net/k65s3/

Invoer:

Entity:&nbsp;Bad attempt at XSS:<script>alert('new\nline?')</script><br>

Uitgang:

Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>

5, Autoriteit 19%

Hier is een snelle methode die niet nodig is om een ​​div te maken en decodeert de “meest voorkomende” HTML-ontsnapte tekens:

function decodeHTMLEntities(text) {
    var entities = [
        ['amp', '&'],
        ['apos', '\''],
        ['#x27', '\''],
        ['#x2F', '/'],
        ['#39', '\''],
        ['#47', '/'],
        ['lt', '<'],
        ['gt', '>'],
        ['nbsp', ' '],
        ['quot', '"']
    ];
    for (var i = 0, max = entities.length; i < max; ++i) 
        text = text.replace(new RegExp('&'+entities[i][0]+';', 'g'), entities[i][1]);
    return text;
}

6, Autoriteit 10%

Hier is een andere versie:

function convertHTMLEntity(text){
    const span = document.createElement('span');
    return text
    .replace(/&[#A-Za-z0-9]+;/gi, (entity,position,text)=> {
        span.innerHTML = entity;
        return span.innerText;
    });
}
console.log(convertHTMLEntity('Large &lt; &#163; 500'));

7, Autoriteit 9%

Geïnspireerd door Robert K’s oplossing, straalt deze versie geen HTML-tags, en is net zo veilig.

var decode_entities = (function() {
    // Remove HTML Entities
    var element = document.createElement('div');
    function decode_HTML_entities (str) {
        if(str && typeof str === 'string') {
            // Escape HTML before decoding for HTML Entities
            str = escape(str).replace(/%26/g,'&').replace(/%23/g,'#').replace(/%3B/g,';');
            element.innerHTML = str;
            if(element.innerText){
                str = element.innerText;
                element.innerText = '';
            }else{
                // Firefox support
                str = element.textContent;
                element.textContent = '';
            }
        }
        return unescape(str);
    }
    return decode_HTML_entities;
})();

Antwoord 8, autoriteit 6%

jQuery biedt een manier om html-entiteiten te coderen en te decoderen.

Als u een “<div/>” gebruikt tag, het verwijdert alle html.

function htmlDecode(value) {
    return $("<div/>").html(value).text();
}
function htmlEncode(value) {
    return $('<div/>').text(value).html();
}

Als u een “<textarea/>” gebruikt tag, dan blijven de html-tags behouden.

function htmlDecode(value) {
    return $("<textarea/>").html(value).text();
}
function htmlEncode(value) {
    return $('<textarea/>').text(value).html();
}

Antwoord 9, autoriteit 5%

Om nog een “geïnspireerd door Robert K” aan de lijst toe te voegen, is hier nog een veiligeversie die geen HTML-tags verwijdert. In plaats van de hele string door de HTML-parser te laten lopen, worden alleen de entiteiten eruit gehaald en geconverteerd.

var decodeEntities = (function() {
    // this prevents any overhead from creating the object each time
    var element = document.createElement('div');
    // regular expression matching HTML entities
    var entity = /&(?:#x[a-f0-9]+|#[0-9]+|[a-z0-9]+);?/ig;
    return function decodeHTMLEntities(str) {
        // find and replace all the html entities
        str = str.replace(entity, function(m) {
            element.innerHTML = m;
            return element.textContent;
        });
        // reset the value
        element.textContent = '';
        return str;
    }
})();

Antwoord 10, autoriteit 5%

Geïnspireerd door de oplossing van Robert K, verwijdert html-tags en voorkomt het uitvoeren van scriptsen eventhandlers zoals: <img src=fake onerror="prompt(1)">
Getest op de nieuwste Chrome, FF, IE (zou moeten werken vanaf IE9, maar niet getest).

var decodeEntities = (function () {
        //create a new html document (doesn't execute script tags in child elements)
        var doc = document.implementation.createHTMLDocument("");
        var element = doc.createElement('div');
        function getText(str) {
            element.innerHTML = str;
            str = element.textContent;
            element.textContent = '';
            return str;
        }
        function decodeHTMLEntities(str) {
            if (str && typeof str === 'string') {
                var x = getText(str);
                while (str !== x) {
                    str = x;
                    x = getText(x);
                }
                return x;
            }
        }
        return decodeHTMLEntities;
    })();

Gewoon bellen:

decodeEntities('<img src=fake onerror="prompt(1)">');
decodeEntities("<script>alert('aaa!')</script>");

Antwoord 11, autoriteit 4%

Het injecteren van niet-vertrouwde HTML op de pagina is gevaarlijk, zoals uitgelegd in HTML-entiteiten decoderen met jQuery?.

Een alternatief is om een JavaScript-implementatie van PHP’s html_entity_decode (van http://phpjs. org/functions/html_entity_decode:424). Het voorbeeld zou dan zoiets zijn als:

var varTitle = html_entity_decode("Chris&apos; corner");

Antwoord 12, autoriteit 4%

Hier is een volledige versie

function htmldecode(s){
    window.HTML_ESC_MAP = {
    "nbsp":" ","iexcl":"¡","cent":"¢","pound":"£","curren":"¤","yen":"¥","brvbar":"¦","sect":"§","uml":"¨","copy":"©","ordf":"ª","laquo":"«","not":"¬","reg":"®","macr":"¯","deg":"°","plusmn":"±","sup2":"²","sup3":"³","acute":"´","micro":"µ","para":"¶","middot":"·","cedil":"¸","sup1":"¹","ordm":"º","raquo":"»","frac14":"¼","frac12":"½","frac34":"¾","iquest":"¿","Agrave":"À","Aacute":"Á","Acirc":"Â","Atilde":"Ã","Auml":"Ä","Aring":"Å","AElig":"Æ","Ccedil":"Ç","Egrave":"È","Eacute":"É","Ecirc":"Ê","Euml":"Ë","Igrave":"Ì","Iacute":"Í","Icirc":"Î","Iuml":"Ï","ETH":"Ð","Ntilde":"Ñ","Ograve":"Ò","Oacute":"Ó","Ocirc":"Ô","Otilde":"Õ","Ouml":"Ö","times":"×","Oslash":"Ø","Ugrave":"Ù","Uacute":"Ú","Ucirc":"Û","Uuml":"Ü","Yacute":"Ý","THORN":"Þ","szlig":"ß","agrave":"à","aacute":"á","acirc":"â","atilde":"ã","auml":"ä","aring":"å","aelig":"æ","ccedil":"ç","egrave":"è","eacute":"é","ecirc":"ê","euml":"ë","igrave":"ì","iacute":"í","icirc":"î","iuml":"ï","eth":"ð","ntilde":"ñ","ograve":"ò","oacute":"ó","ocirc":"ô","otilde":"õ","ouml":"ö","divide":"÷","oslash":"ø","ugrave":"ù","uacute":"ú","ucirc":"û","uuml":"ü","yacute":"ý","thorn":"þ","yuml":"ÿ","fnof":"ƒ","Alpha":"Α","Beta":"Β","Gamma":"Γ","Delta":"Δ","Epsilon":"Ε","Zeta":"Ζ","Eta":"Η","Theta":"Θ","Iota":"Ι","Kappa":"Κ","Lambda":"Λ","Mu":"Μ","Nu":"Ν","Xi":"Ξ","Omicron":"Ο","Pi":"Π","Rho":"Ρ","Sigma":"Σ","Tau":"Τ","Upsilon":"Υ","Phi":"Φ","Chi":"Χ","Psi":"Ψ","Omega":"Ω","alpha":"α","beta":"β","gamma":"γ","delta":"δ","epsilon":"ε","zeta":"ζ","eta":"η","theta":"θ","iota":"ι","kappa":"κ","lambda":"λ","mu":"μ","nu":"ν","xi":"ξ","omicron":"ο","pi":"π","rho":"ρ","sigmaf":"ς","sigma":"σ","tau":"τ","upsilon":"υ","phi":"φ","chi":"χ","psi":"ψ","omega":"ω","thetasym":"ϑ","upsih":"ϒ","piv":"ϖ","bull":"•","hellip":"…","prime":"′","Prime":"″","oline":"‾","frasl":"⁄","weierp":"℘","image":"ℑ","real":"ℜ","trade":"™","alefsym":"ℵ","larr":"←","uarr":"↑","rarr":"→","darr":"↓","harr":"↔","crarr":"↵","lArr":"⇐","uArr":"⇑","rArr":"⇒","dArr":"⇓","hArr":"⇔","forall":"∀","part":"∂","exist":"∃","empty":"∅","nabla":"∇","isin":"∈","notin":"∉","ni":"∋","prod":"∏","sum":"∑","minus":"−","lowast":"∗","radic":"√","prop":"∝","infin":"∞","ang":"∠","and":"∧","or":"∨","cap":"∩","cup":"∪","int":"∫","there4":"∴","sim":"∼","cong":"≅","asymp":"≈","ne":"≠","equiv":"≡","le":"≤","ge":"≥","sub":"⊂","sup":"⊃","nsub":"⊄","sube":"⊆","supe":"⊇","oplus":"⊕","otimes":"⊗","perp":"⊥","sdot":"⋅","lceil":"⌈","rceil":"⌉","lfloor":"⌊","rfloor":"⌋","lang":"〈","rang":"〉","loz":"◊","spades":"♠","clubs":"♣","hearts":"♥","diams":"♦","\"":"quot","amp":"&","lt":"<","gt":">","OElig":"Œ","oelig":"œ","Scaron":"Š","scaron":"š","Yuml":"Ÿ","circ":"ˆ","tilde":"˜","ndash":"–","mdash":"—","lsquo":"‘","rsquo":"’","sbquo":"‚","ldquo":"“","rdquo":"”","bdquo":"„","dagger":"†","Dagger":"‡","permil":"‰","lsaquo":"‹","rsaquo":"›","euro":"€"};
    if(!window.HTML_ESC_MAP_EXP)
        window.HTML_ESC_MAP_EXP = new RegExp("&("+Object.keys(HTML_ESC_MAP).join("|")+");","g");
    return s?s.replace(window.HTML_ESC_MAP_EXP,function(x){
        return HTML_ESC_MAP[x.substring(1,x.length-1)]||x;
    }):s;
}

Gebruik

htmldecode("&sum;&nbsp;&gt;&euro;");

Antwoord 13, autoriteit 4%

Een meer functionele benadering van het antwoord van @William Lahti:

var entities = {
  'amp': '&',
  'apos': '\'',
  '#x27': '\'',
  '#x2F': '/',
  '#39': '\'',
  '#47': '/',
  'lt': '<',
  'gt': '>',
  'nbsp': ' ',
  'quot': '"'
}
function decodeHTMLEntities (text) {
  return text.replace(/&([^;]+);/gm, function (match, entity) {
    return entities[entity] || match
  })
}

14

Ik weet dat ik een beetje laat ben aan het spel, maar ik dacht dat ik het volgende fragment zou kunnen verstrekken als een voorbeeld van hoe ik HTML-entiteiten met JQuery decoderen:

var varTitleE = "Chris&apos; corner";
var varTitleD = $("<div/>").html(varTitleE).text();
console.log(varTitleE + " vs. " + varTitleD);​​​​​​​​​​​

Vergeet niet je inspecteur/firebug op te starten om de consoleresultaten te zien — of vervang eenvoudig console.log(…) w/alert(…)

Dat gezegd hebbende, dit is wat mijn console via de Google Chrome-inspecteur las:

Chris&apos; corner vs. Chris' corner

Antwoord 15

Om het in puur javascript te doen zonder jQuery of alles vooraf te definiëren, kun je de gecodeerde html-tekenreeks door een element innerHTML en innerText(/textContent) eigenschappen laten lopen voor elke vereiste decoderingsstap:

<html>
  <head>
    <title>For every decode step, cycle through innerHTML and innerText </title>
    <script>
function decode(str) {
  var d = document.createElement("div");
  d.innerHTML = str; 
  return typeof d.innerText !== 'undefined' ? d.innerText : d.textContent;
}
    </script>
  </head>
  <body>
    <script>
var encodedString = "&lt;p&gt;name&lt;/p&gt;&lt;p&gt;&lt;span style=\"font-size:xx-small;\"&gt;ajde&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;da&lt;/em&gt;&lt;/p&gt;";
    </script>
    <input type=button onclick="document.body.innerHTML=decode(encodedString)"/>
  </body>
</html>

Antwoord 16

Ik denk dat dat precies het tegenovergestelde is van de gekozen oplossing.

var decoded = $("<div/>").text(encodedStr).html();

Probeer het 🙂

Other episodes