232 votes

Décodage & retour vers & en javascript

J'ai des chaînes de caractères comme

var str = 'One & two & three';

rendu en HTML par le serveur web. J'ai besoin de transformer ces chaînes en

'One & two & three'

Actuellement, c'est ce que je suis en train de faire (avec l'aide de jQuery):

$(document.createElement('div')).html('{{ driver.person.name }}').text()

Toutefois, j'ai un sentiment troublant que je me suis fais mal. J'ai essayé

unescape("&")

mais il ne semble pas fonctionner, ni ne decodeURI/decodeURIComponent.

Existe-il d'autres, plus naturel et élégant moyens de le faire?

294voto

LukeH Points 110965

Avez-vous besoin de décoder toutes les entités HTML encodées ou seulement & lui-même?

Si vous avez seulement besoin de gérer & vous pouvez le faire:

 var decoded = encoded.replace(/&/g, '&');
 

Si vous devez décoder toutes les entités HTML, alors ce que vous avez est très bien, bien que vous puissiez le faire sans jQuery si vous voulez:

 var div = document.createElement('div');
div.innerHTML = encoded;
var decoded = div.firstChild.nodeValue;
 

23voto

WaiKit Kung Points 307
 var htmlEnDeCode = (function() {
    var charToEntityRegex,
        entityToCharRegex,
        charToEntity,
        entityToChar;

    function resetCharacterEntities() {
        charToEntity = {};
        entityToChar = {};
        // add the default set
        addCharacterEntities({
            '&'     :   '&',
            '>'      :   '>',
            '&lt;'      :   '<',
            '&quot;'    :   '"',
            '&#39;'     :   "'"
        });
    }

    function addCharacterEntities(newEntities) {
        var charKeys = [],
            entityKeys = [],
            key, echar;
        for (key in newEntities) {
            echar = newEntities[key];
            entityToChar[key] = echar;
            charToEntity[echar] = key;
            charKeys.push(echar);
            entityKeys.push(key);
        }
        charToEntityRegex = new RegExp('(' + charKeys.join('|') + ')', 'g');
        entityToCharRegex = new RegExp('(' + entityKeys.join('|') + '|&#[0-9]{1,5};' + ')', 'g');
    }

    function htmlEncode(value){
        var htmlEncodeReplaceFn = function(match, capture) {
            return charToEntity[capture];
        };

        return (!value) ? value : String(value).replace(charToEntityRegex, htmlEncodeReplaceFn);
    }

    function htmlDecode(value) {
        var htmlDecodeReplaceFn = function(match, capture) {
            return (capture in entityToChar) ? entityToChar[capture] : String.fromCharCode(parseInt(capture.substr(2), 10));
        };

        return (!value) ? value : String(value).replace(entityToCharRegex, htmlDecodeReplaceFn);
    }

    resetCharacterEntities();

    return {
        htmlEncode: htmlEncode,
        htmlDecode: htmlDecode
    };
})();
 

Cela provient du code source ExtJS.

16voto

avg_joe Points 41

element.**innerText** aussi l'affaire.

4voto

Infoglaze.com Points 26

Tout d'abord créer un <span id="decodeIt" style="Displaye:none;"></span> quelque part dans le corps

Ensuite, affectez la chaîne à décoder en tant que innerHTML à ceci:

 document.getElementById("decodeIt").innerHTML=stringtodecode
 

Finalement,

 stringtodecode=document.getElementById("decodeIt").innerText
 

Voici le code général:

 var stringtodecode="<B>Hello</B> world<br>";
document.getElementById("decodeIt").innerHTML=stringtodecode;
stringtodecode=document.getElementById("decodeIt").innerText
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X