91 votes

comment échapper aux entités xml en javascript ?

En JavaScript (nodejs côté serveur), j'écris un programme qui génère du XML en sortie.

Je construis le XML en concaténant une chaîne :

 str += '<' + key + '>';
str += value;
str += '</' + key + '>';

Le problème est le suivant : et si value contient des caractères tels que '&' , '>' ou '<' ? Quelle est la meilleure façon d'échapper à ces personnages ?

ou existe-t-il une bibliothèque javascript autour de laquelle les entités XML peuvent s'échapper ?

139voto

hgoebl Points 2410

Cela pourrait être un peu plus efficace avec le même résultat :

 function escapeXml(unsafe) {
    return unsafe.replace(/[<>&'"]/g, function (c) {
        switch (c) {
            case '<': return '&lt;';
            case '>': return '&gt;';
            case '&': return '&amp;';
            case '\'': return '&apos;';
            case '"': return '&quot;';
        }
    });
}

24voto

jpatokal Points 6061

Si vous avez jQuery, voici une solution simple :

   String.prototype.htmlEscape = function() {
    return $('<div/>').text(this.toString()).html();
  };

Utilisez-le comme ceci :

"<foo&bar>".htmlEscape(); -> "&lt;foo&amp;bar&gt"

8voto

sudhAnsu63 Points 1971

vous pouvez utiliser la méthode ci-dessous. J'ai ajouté ceci dans le prototype pour un accès plus facile. J'ai également utilisé une prévision négative pour que cela ne gâche pas les choses si vous appelez la méthode deux fois ou plus.

Usage:

  var original = "Hi&there";
 var escaped = original.EncodeXMLEscapeChars();  //Hi&amp;there

Le décodage est géré automatiquement dans l'analyseur XML.

Méthode :

 //String Extenstion to format string for xml content.
//Replces xml escape chracters to their equivalent html notation.
String.prototype.EncodeXMLEscapeChars = function () {
    var OutPut = this;
    if ($.trim(OutPut) != "") {
        OutPut = OutPut.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
        OutPut = OutPut.replace(/&(?!(amp;)|(lt;)|(gt;)|(quot;)|(#39;)|(apos;))/g, "&amp;");
        OutPut = OutPut.replace(/([^\\])((\\\\)*)\\(?![\\/{])/g, "$1\\\\$2");  //replaces odd backslash(\\) with even.
    }
    else {
        OutPut = "";
    }
    return OutPut;
};

3voto

Quandary Points 12867

Attention, toutes les regexings ne sont pas bonnes si vous avez du XML dans XML. Au lieu de cela, bouclez une fois sur la chaîne et remplacez tous les caractères d'échappement. De cette façon, vous ne pouvez pas écraser deux fois le même personnage.

 function _xmlAttributeEscape(inputString)
{
    var output = [];

    for (var i = 0; i < inputString.length; ++i)
    {
        switch (inputString[i])
        {
            case '&':
                output.push("&amp;");
                break;
            case '"':
                output.push("&quot;");
                break;
            case "<":
                output.push("&lt;");
                break;
            case ">":
                output.push("&gt;");
                break;
            default:
                output.push(inputString[i]);
        }


    }

    return output.join("");
}

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