web-dev-qa-db-fra.com

Suppression de toutes les balises de script du code HTML avec JS Regular Expression

je veux dépouiller les balises de script de ce code HTML à Pastebin

http://Pastebin.com/mdxygM0a

J'ai essayé d'utiliser l'expression régulière ci-dessous

html.replace(/<script.*>.*<\/script>/ims, " ")

Mais cela ne supprime pas toutes les balises de script du code HTML. Il ne supprime que les scripts en ligne. S'il vous plaît j'ai besoin d'une regex qui peut supprimer toutes les balises de script (en ligne et multi-ligne). Un test sur mon échantillon serait très apprécié http://Pastebin.com/mdxygM0a

Merci

57
Kennedy

Tenter de supprimer le balisage HTML à l'aide d'une expression régulière pose problème. Vous ne savez pas ce qu'il y a dedans comme valeurs de script ou d'attribut. Une solution consiste à l'insérer en tant que innerHTML d'un div, à supprimer tous les éléments de script et à renvoyer le innerHTML, par exemple.

  function stripScripts(s) {
    var div = document.createElement('div');
    div.innerHTML = s;
    var scripts = div.getElementsByTagName('script');
    var i = scripts.length;
    while (i--) {
      scripts[i].parentNode.removeChild(scripts[i]);
    }
    return div.innerHTML;
  }

alert(
 stripScripts('<span><script type="text/javascript">alert(\'foo\');<\/script><\/span>')
);

Notez que pour le moment, les navigateurs n'exécutent pas le script s'ils sont insérés à l'aide de la propriété innerHTML, et ne le feront probablement jamais, d'autant plus que l'élément n'est pas ajouté au document.

79
RobG

jQuery utilise une expression rationnelle pour supprimer les balises de script dans certains cas et je suis presque sûr que ses développeurs avaient une sacrée bonne raison de le faire. Il est probable que certains navigateurs exécutent des scripts lors de leur insertion à l'aide de innerHTML.

Voici la regex:

/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi

Et avant que les gens ne commencent à pleurer "mais les regexes pour HTML sont diaboliques": Oui, ils sont - mais pour les balises de script, ils sont en sécurité en raison du comportement spécial - une section <script> ne peut contenir du tout </script> que si cette position. Donc, le faire correspondre avec une expression rationnelle est facilement possible. Cependant, d’un coup d’œil rapide, l’expression rationnelle ci-dessus ne tient pas compte des espaces à la fin de la balise de fermeture; vous devez donc vérifier si </script   , etc. fonctionnera toujours.

93
ThiefMaster

Les expressions rationnelles sont valables, mais si vous avez une version HTML à chaîne que vous ne voulez pas injecter dans un DOM, elles peuvent constituer la meilleure approche. Vous voudrez peut-être le mettre en boucle pour gérer quelque chose comme:

<scr<script>Ha!</script>ipt> alert(document.cookie);</script>

Voici ce que j'ai fait, en utilisant la regex jquery d'en haut:

var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
while (SCRIPT_REGEX.test(text)) {
    text = text.replace(SCRIPT_REGEX, "");
}
41
Conrad Damon

Cette regex devrait aussi marcher:

<script(?:(?!\/\/)(?!\/\*)[^'"]|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\/\/.*(?:\n)|\/\*(?:(?:.|\s))*?\*\/)*?<\/script>

Cela permet même d’avoir des chaînes de variables "problématiques" comme celles-ci:

<script type="text/javascript">
   var test1 = "</script>";
   var test2 = '\'</script>';
   var test1 = "\"</script>";
   var test1 = "<script>\"";
   var test2 = '<scr\'ipt>';
   /* </script> */
   // </script>
   /* ' */
   // var foo=" '
</script>

Il semble que jQuery et Prototype échouent sur ces derniers ...

Édition 31 juillet '17: Ajouté un a) groupes ne capturant pas pour de meilleures performances (et aucun groupe vide) et b) support des commentaires JavaScript.

10
spaark

Chaque fois que vous devez recourir au nettoyage des balises de script basé sur Regex. Au moins ajouter un espace blanc à la balise de fermeture sous la forme de 

</script\s*>

Sinon, des choses comme

<script>alert(666)</script   >

resterait puisque les espaces de fin après les noms de variables sont valides.

10
neongrau

Pourquoi ne pas utiliser jQuery.parseHTML () http://api.jquery.com/jquery.parsehtml/ -

4
shao

Dans mon cas, j'avais besoin d'une analyse préalable du titre de la page ET et de tous les autres avantages de jQuery, moins les scripts de déclenchement. Voici ma solution qui semble fonctionner.

        $.get('/somepage.htm', function (data) {
            // excluded code to extract title for simplicity
            var bodySI = data.indexOf('<body>') + '<body>'.length,
                bodyEI = data.indexOf('</body>'),
                body = data.substr(bodySI, bodyEI - bodySI),
                $body;

            body = body.replace(/<script[^>]*>/gi, ' <!-- ');
            body = body.replace(/<\/script>/gi, ' --> ');

            //console.log(body);

            $body = $('<div>').html(body);
            console.log($body.html());
        });

Ce type de raccourcis s’inquiète pour le script car vous n’essayez pas de supprimer les balises de script et leur contenu, mais vous les remplacez par des schémas de rendu des commentaires afin de les supprimer, car vous auriez des commentaires qui délimiteraient vos déclarations de script.

Faites-moi savoir si cela pose toujours un problème car cela m'aidera aussi.

1
Jason Sebring

Si vous souhaitez supprimer tout le code JavaScript d'un texte HTML, supprimer les balises <script> ne suffit pas, car JavaScript peut toujours vivre dans "onclick", "onerror", "href" et d'autres attributs.

Essayez ce module npm qui gère tout cela: https://www.npmjs.com/package/strip-js

1
Shivanshu Goyal

Tu peux essayer 

$("your_div_id").remove();  

ou

 $("your_div_id").html(""); 
0
Pooja Roy

Voici une variété de scripts Shell que vous pouvez utiliser pour éliminer différents éléments.

# doctype
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/<\!DOCTYPE\s\+html[^>]*>/<\!DOCTYPE html>/gi" {} \;

# meta charset
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/<meta[^>]*content=[\"'][^\"']*utf-8[\"'][^>]*>/<meta charset=\"utf-8\">/gi" {} \;

# script text/javascript
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<script[^>]*\)\(\stype=[\"']text\/javascript[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;

# style text/css
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<style[^>]*\)\(\stype=[\"']text\/css[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;

# html xmlns
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxmlns=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;

# html xml:lang
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxml:lang=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;
0
davidcondrey

Essaye ça:

var text = text.replace(/<script[^>]*>(?:(?!<\/script>)[^])*<\/script>/g, "")
0
surinder singh

/ (?: (?! </ s\w) <[^ <]) </ s\w */gi; - Supprime toute séquence de toute combinaison avec 

0
Blackening