149 votes

Convertir les caractères spéciaux en HTML en Javascript

Est-ce que quelqu'un sait comment convertir des caractères spéciaux en HTML en Javascript ?

Exemple :

  • & (esperluette) devient &amp .
  • " (guillemet double) devient &quot quand ENT_NOQUOTES n'est pas défini.
  • ' (guillemets simples) devient &#039 seulement quand ENT_QUOTES est réglé.
  • < (moins que) devient &lt .
  • > (plus grand que) devient &gt .

0 votes

0 votes

Vous pouvez utiliser cette bibliothèque : npmjs.com/package/utf8

0 votes

Voir JavaScript htmlentities phpjs.org/functions/htmlentities:425

225voto

Cerebrus Points 18045

Le meilleur moyen, à mon avis, est d'utiliser la fonctionnalité d'échappement HTML intégrée au navigateur pour gérer la plupart des cas. Pour ce faire, il suffit de créer un élément dans l'arbre DOM et de définir l'attribut innerText de l'élément à votre chaîne. Ensuite, récupérez le innerHTML de l'élément. Le navigateur renvoie une chaîne de caractères codée en HTML.

function HtmlEncode(s)
{
  var el = document.createElement("div");
  el.innerText = el.textContent = s;
  s = el.innerHTML;
  return s;
}

Test de fonctionnement :

alert(HtmlEncode('&;\'><"'));

Output:

&amp;;'&gt;&lt;"

Cette méthode d'échappement du HTML est également utilisée par l'application Bibliothèque Prototype JS mais différemment de l'échantillon simpliste que j'ai donné.

Remarque : vous devrez toujours échapper vous-même les guillemets (doubles et simples). Vous pouvez utiliser l'une des méthodes décrites par d'autres ici.

4 votes

Notez que delete el est une erreur ici. perfectionkills.com/compréhension-delete

1 votes

Cela ne fait rien pour moi quand je l'essaie. Je récupère les caractères inchangés.

2 votes

Désolé, je testais avec des caractères impairs, de plus Chrome est sournois et ne vous montre pas la vraie sortie HTML, mais Firebug le fait (en fait il a montré une entité html pour le symbole de copyright alors que la source générée ne l'encode pas). Cela fonctionne bien sur <>& mais n'est pas aussi complet que les solutions de Neotropic ou de KooiInc.

91voto

Steven Points 1641

Vous avez besoin d'une fonction qui fait quelque chose comme

return mystring.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");

Mais en tenant compte de votre souhait d'une gestion différente des guillemets simples/doubles.

1 votes

À quoi sert la barre oblique g ?

7 votes

@JohnnyBizzle /g dans une expression régulière signifie "global". En d'autres termes, toutes les occurrences de la chaîne seront remplacées. Sans /g seul le premier match serait remplacé.

0 votes

Une meilleure réponse est stackoverflow.com/a/4835406/7514010

34voto

KooiInc Points 38845

Cette fonction générique encode chaque caractère non alphabétique dans son code html (numérique) :

function HTMLEncode(str) {
    var i = str.length,
        aRet = [];

    while (i--) {
        var iC = str[i].charCodeAt();
        if (iC < 65 || iC > 127 || (iC>90 && iC<97)) {
            aRet[i] = '&#'+iC+';';
        } else {
            aRet[i] = str[i];
        }
    }
    return aRet.join('');
}

1 votes

Cela semble vraiment intelligent mais je n'arrive à convertir que les bases : <>&

0 votes

Nvm. Ça fonctionne bien dans une console, mais quand on l'affiche dans le navigateur, on dirait qu'il n'y a pas eu de conversion. Qu'est-ce qui se passe avec ça ?

0 votes

@Moss : le navigateur rend les caractères codés en html aux caractères qu'ils représentent. L'avantage des caractères codés en html est que le navigateur n'a pas à deviner la traduction des caractères diacritiques (par exemple) et rend donc toujours ces caractères comme ils devraient être rendus.

26voto

Matt Hanson Points 1929

Créez une fonction qui utilise la chaîne de caractères replace

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

0 votes

Je faisais face à un problème avec seulement des guillemets simples( ') & des guillemets doubles (") dans ma valeur d'entrée à afficher en html. script se brisait si l'utilisateur l'ajoutait.

23voto

user1949536 Points 71

De Mozilla ...

Notez que charCodeAt renvoie toujours une valeur inférieure à 65 536. Cela s'explique par le fait que les points de code supérieurs sont représentés par une paire de pseudo-caractères "de substitution" (de valeur inférieure) qui sont utilisés pour composer le caractère réel. Pour cette raison, afin d'examiner ou de reproduire le caractère complet pour les caractères individuels de valeur 65 536 et plus, il est nécessaire, pour ces caractères, de récupérer non seulement charCodeAt(i), mais aussi charCodeAt(i+1) (comme si l'on examinait/reproduisait une chaîne avec deux >lettres).

La meilleure solution

/**
 * (c) 2012 Steven Levithan <http://slevithan.com/>
 * MIT license
 */
if (!String.prototype.codePointAt) {
    String.prototype.codePointAt = function (pos) {
        pos = isNaN(pos) ? 0 : pos;
        var str = String(this),
            code = str.charCodeAt(pos),
            next = str.charCodeAt(pos + 1);
        // If a surrogate pair
        if (0xD800 <= code && code <= 0xDBFF && 0xDC00 <= next && next <= 0xDFFF) {
            return ((code - 0xD800) * 0x400) + (next - 0xDC00) + 0x10000;
        }
        return code;
    };
}

/**
 * Encodes special html characters
 * @param string
 * @return {*}
 */
function html_encode(string) {
    var ret_val = '';
    for (var i = 0; i < string.length; i++) { 
        if (string.codePointAt(i) > 127) {
            ret_val += '&#' + string.codePointAt(i) + ';';
        } else {
            ret_val += string.charAt(i);
        }
    }
    return ret_val;
}

Exemple d'utilisation :

html_encode("");

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