377 votes

Puis-je échapper aux caractères spéciaux HTML en JavaScript ?

Je veux afficher du texte en HTML par une fonction JavaScript. Comment puis-je échapper aux caractères spéciaux HTML en JavaScript ? Existe-t-il une API ?

22 votes

Il ne s'agit pas d'un doublon, puisque cette question ne porte pas sur jQuery. Je ne suis intéressé que par celle-ci, puisque je n'utilise pas jQuery...

7 votes

546voto

bjornd Points 11457
function escapeHtml(unsafe) {
    return unsafe
         .replace(/&/g, "&")
         .replace(/</g, "&lt;")
         .replace(/>/g, "&gt;")
         .replace(/"/g, "&quot;")
         .replace(/'/g, "&#039;");
 }

20 votes

Pourquoi "'" et non "'" ?

59 votes

4 votes

Je pense que les expressions régulières dans replace() sont inutiles. De simples chaînes à un seul caractère feraient tout aussi bien l'affaire.

81voto

spiderlama Points 166
function escapeHtml(html){
  var text = document.createTextNode(html);
  var p = document.createElement('p');
  p.appendChild(text);
  return p.innerHTML;
}

// Escape while typing & print result
document.querySelector('input').addEventListener('input', e => {
  console.clear();
  console.log( escapeHtml(e.target.value) );
});

<input style='width:90%; padding:6px;' placeholder='&lt;b&gt;cool&lt;/b&gt;'>

0 votes

Cela fonctionne ici mais pas pour moi hors ligne dans le navigateur.

10 votes

Notez que cela n'échappe pas aux guillemets ( " o ' ), de sorte que les chaînes de cette fonction peuvent encore faire des dégâts si elles sont utilisées dans des attributs de balises HTML.

59voto

jeremysawesome Points 2539

Vous pouvez utiliser l'outil de jQuery .text() fonction .

Par exemple :

http://jsfiddle.net/9H6Ch/

D'après la documentation de jQuery concernant le .text() fonction :

Il faut savoir que cette méthode échappe la chaîne fournie comme nécessaire pour qu'elle soit rendue correctement en HTML. Pour ce faire, elle appelle la méthode DOM .createTextNode(), mais n'interprète pas la chaîne en tant que HTML.

Les versions précédentes de la documentation de jQuery le formulaient de cette façon ( accentuation ajoutée ) :

Il faut savoir que cette méthode échappe la chaîne fournie comme il se doit afin qu'elle soit rendue correctement en HTML. Pour ce faire, elle appelle la méthode DOM .createTextNode(), qui remplace les caractères spéciaux par leurs équivalents en entité HTML (comme < pour <).

10 votes

Vous pouvez même l'utiliser sur un élément frais si vous voulez juste convertir comme ça : const str = "foo<>'\"&"; $('<div>').text(str).html() donne foo&lt;&gt;'"&amp;

4 votes

Notez que cela laisse les guillemets ' y " non encodé, ce qui peut vous faire trébucher

49voto

lvella Points 3221

Je pense avoir trouvé la bonne façon de faire...

// Create a DOM Text node:
var text_node = document.createTextNode(unescaped_text);

// Get the HTML element where you want to insert the text into:
var elem = document.getElementById('msg_span');

// Optional: clear its old contents
//elem.innerHTML = '';

// Append the text node into it:
elem.appendChild(text_node);

0 votes

J'ai appris quelque chose de nouveau sur le HTML aujourd'hui. w3schools.com/jsref/met_document_createtextnode.asp .

5 votes

Sachez que le contenu du nœud texte n'est pas échappé si vous essayez d'y accéder de cette manière : document.createTextNode("<script>alert('Attack!')</script>")‌​.textContent

0 votes

C'est la bonne méthode si vous ne faites que mettre du texte. Il y a aussi textContent mais apparemment il n'est pas bien supporté. Cela ne fonctionnera pas cependant si vous construisez une chaîne de caractères avec certaines parties de texte et d'autres de html, alors vous devez toujours utiliser l'échappement.

-4voto

Lucky Points 81

Essayez ceci, en utilisant le prototype.js bibliothèque :

string.escapeHTML();

Essayer une démo

10 votes

Cela nécessite la bibliothèque "prototype.js", ce qui n'était pas immédiatement apparent dans la démo :(.

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