200 votes

Quel est l'équivalent de HtmlSpecialChars en JavaScript ?

Apparemment, c'est plus difficile à trouver que je ne le pensais. Et c'est même si simple...

Existe-t-il une fonction équivalente à la fonction PHP htmlspecialchars intégré à JavaScript ? Je sais qu'il est assez facile de l'implémenter soi-même, mais utiliser une fonction intégrée, si elle est disponible, est tout simplement plus agréable.

Pour ceux qui ne sont pas familiers avec PHP, htmlspecialchars traduit des choses comme <htmltag/> sur &lt;htmltag/&gt;

Je sais que escape() y encodeURI() ne fonctionnent pas de cette manière.

0 votes

Php possède de très bons outils, var_dump, print_r, htmlspecialchars, etc. Malheureusement, je soupçonne qu'il n'en est pas de même avec js. js alert est si pauvre. Un moyen rapide de voir qu'une chaîne inattendue (et invisible dans la boîte d'alerte) arrive, est d'alerter la longueur de la chaîne au lieu de la chaîne elle-même.

0 votes

1 votes

Ver stackoverflow.com/a/12034334/8804293 il a une grande réponse

365voto

Kip Points 37013

Il y a un problème avec votre code de solution - il n'échappe que la première occurrence de chaque caractère spécial. Par exemple :

escapeHtml('Kip\'s <b>evil</b> "test" code\'s here');
Actual:   Kip&#039;s &lt;b&gt;evil</b> &quot;test" code's here
Expected: Kip&#039;s &lt;b&gt;evil&lt;/b&gt; &quot;test&quot; code&#039;s here

Voici un code qui fonctionne correctement :

function escapeHtml(text) {
  return text
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;")
      .replace(/'/g, "&#039;");
}

Mise à jour

Le code suivant produira des résultats identiques à ceux de la version précédente, mais il est plus performant, en particulier sur les grands blocs de texte (merci jbo5112 ).

function escapeHtml(text) {
  var map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };

  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}

5 votes

L'avantage de cette fonction est qu'elle fonctionne dans node.js qui n'a pas de dom par défaut.

7 votes

Il est plus rapide d'utiliser une seule fonction de remplacement et de mappage, et le remplacement unique est beaucoup plus efficace. ( jsperf.com/escape-html-special-chars/11 )

1 votes

@jbo5112 bon point, je n'avais pas réalisé que JS permettait les callbacks pour le remplacement. Ce code est plus facile à comprendre cependant, et je doute que le fait de gagner quelques millisecondes sur escapeHtml() fasse une différence, à moins que vous ne l'appeliez des centaines de fois à la suite pour une raison quelconque.

35voto

o.k.w Points 15721

C'est l'encodage HTML. Il n'y a pas de fonction javascript native pour faire cela, mais vous pouvez chercher sur Google et en trouver de jolies.

Par exemple http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/

EDIT :
C'est ce que j'ai testé :

var div = document.createElement('div');
  var text = document.createTextNode('<htmltag/>');
  div.appendChild(text);
  console.log(div.innerHTML);

Sortie : &lt;htmltag/&gt;

0 votes

Dommage, je vais devoir utiliser une fonction personnalisée alors.

0 votes

Vous pouvez essayer la méthode indiquée dans le lien que j'ai inclus dans mon message. C'est un concept très intéressant.

0 votes

@o.k.w : Ok, d'abord tu as fait un lien vers ça : yuki-onna.co.uk/html/encode.html qui fait exactement ce que encodeURIComponent et ce n'est pas du tout ce que le PO a demandé. Donc, pouvez-vous éditer s'il vous plaît ? Je n'arrive pas à défaire mon -1.

30voto

Chris Jacob Points 4211

Cela vaut la peine de le lire : http://bigdingus.com/2007/12/29/html-escaping-in-javascript/

escapeHTML: (function() {
 var MAP = {
   '&': '&amp;',
   '<': '&lt;',
   '>': '&gt;',
   '"': '&#34;',
   "'": '&#39;'
 };
  var repl = function(c) { return MAP[c]; };
  return function(s) {
    return s.replace(/[&<>'"]/g, repl);
  };
})()

Note : Ne le faites qu'une fois. Et ne l'exécutez pas sur des chaînes de caractères déjà encodées, par ex. &amp; devient &amp;amp;

3 votes

Cette réponse devrait être la réponse acceptée et la plus votée. Je ne sais pas pourquoi elle n'a pas été votée. Il s'agit de la réponse la plus rapide avec un résultat de recherche Google long (326 Ko) et une chaîne d'entrée courte sur jsperf ( jsperf.com/escape-html-special-chars/11 ). Veuillez voter en faveur de cette proposition.

0 votes

Quelle est la différence entre cette réponse et celle qui a obtenu le plus de votes ? Pourquoi une fonction interne supplémentaire ? Une explication pourrait aider les utilisateurs à mieux comprendre

18voto

Sasha Yanovets Points 1742

Avec jQuery, cela peut être comme ceci :

var escapedValue = $('<div/>').text(value).html();

Question connexe Échapper aux chaînes HTML avec jQuery

Comme mentionné dans le commentaire, les guillemets doubles et simples sont laissés tels quels dans cette implémentation. Cela signifie que cette solution ne doit pas être utilisée si vous avez besoin de faire un attribut d'élément comme une chaîne html brute.

2 votes

Savez-vous s'il y a des frais généraux à cela - ajouter un objet factice au DOM ?

0 votes

Et y a-t-il d'autres avantages (par exemple, si vous avez des caractères unicode ou autre) ?

0 votes

C'est sûr que ça coûte quelque chose, mais pour la plupart des tâches de nos jours, ça ira. Pour les longs morceaux de texte, cela pourrait même être plus rapide (cela dépend des détails de l'implémentation de la fonction DOM) car replace s'exécute 5 fois. Avantages par rapport à une fonction personnalisée séparée avec des remplacements - cette solution utilise le code de la bibliothèque - cela semble plus sûr :) La version "replace" est une implémentation plus précise de htmlspecialchars.

4voto

patrick Points 21

Utilizar:

String.prototype.escapeHTML = function() {
        return this.replace(/&/g, "&amp;")
                   .replace(/</g, "&lt;")
                   .replace(/>/g, "&gt;")
                   .replace(/"/g, "&quot;")
                   .replace(/'/g, "&#039;");
    }

Échantillon :

var toto = "test<br>";
alert(toto.escapeHTML());

0 votes

Une explication s'impose. Par exemple, pourquoi s'agit-il exactement de ces cinq personnages ? Quelle est la logique qui sous-tend leur sélection ? Veuillez répondre par éditer votre réponse pas ici dans les commentaires ( sans "Editer :", "Mettre à jour :", ou similaire - la réponse doit apparaître comme si elle avait été écrite aujourd'hui).

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