webentwicklung-frage-antwort-db.com.de

Entfernen aller Skript-Tags aus HTML mit JS Regular Expression

ich möchte Skript-Tags aus diesem HTML-Code bei Pastebin entfernen

http://Pastebin.com/mdxygM0a

Ich habe versucht, den regulären Ausdruck zu verwenden

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

Es werden jedoch nicht alle Skript-Tags in der HTML-Datei entfernt. Es entfernt nur Inline-Skripte. Ich brauche einen Regex, der alle Skript-Tags (Inline- und Multi-Line-Tags) entfernen kann. Es würde mich sehr freuen, wenn ein Test mit meinem Beispiel http://Pastebin.com/mdxygM0a durchgeführt wird.

Vielen Dank

57
Kennedy

Der Versuch, HTML-Markup mithilfe eines regulären Ausdrucks zu entfernen, ist problematisch. Sie wissen nicht, was als Skript oder Attributwerte vorhanden ist. Eine Möglichkeit ist, es als innerHTML eines div einzufügen, alle Skriptelemente zu entfernen und die innerHTML zurückzugeben, z.

  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>')
);

Beachten Sie, dass Browser das Skript derzeit nicht ausführen, wenn sie mit der innerHTML-Eigenschaft eingefügt werden. Dies wird wahrscheinlich niemals der Fall sein, zumal das Element nicht zum Dokument hinzugefügt wird.

79
RobG

jQuery verwendet in einigen Fällen einen regulären Ausdruck, um Skript-Tags zu entfernen, und ich bin mir ziemlich sicher, dass seine Entwickler einen verdammt guten Grund hatten, dies zu tun. Wahrscheinlich führt ein Browser do Skripts aus, wenn diese mit innerHTML eingefügt werden.

Hier ist die Regex:

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

Und bevor die Leute anfangen zu weinen ", aber Regex für HTML ist böse": Ja, sie sind -, aber für Skript-Tags sind sie aufgrund des besonderen Verhaltens sicher - ein <script>-Abschnitt enthält möglicherweise überhaupt keinen </script>, es sei denn, er endet bei Diese Position. Es ist also leicht möglich, es mit einem Regex zu kombinieren. Bei einem kurzen Blick berücksichtigt der obige Regex jedoch nicht das nachgestellte Leerzeichen innerhalb des schließenden Tags, so dass Sie testen müssen, ob </script    usw. noch funktioniert.

93
ThiefMaster

Regexes sind schlagbar, aber wenn Sie eine String-Version von HTML haben, die Sie nicht in ein DOM einfügen möchten, sind sie möglicherweise die beste Vorgehensweise. Vielleicht möchten Sie es in eine Schleife schreiben, um etwas zu behandeln:

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

Mit dem Jquery-Regex von oben habe ich Folgendes getan:

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

Diese Regex sollte auch funktionieren:

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

Es erlaubt sogar "problematische" variable Zeichenfolgen wie diese:

<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>

Es scheint, dass jQuery und Prototype bei diesen fehlschlagen ...

Bearbeiten 31. Juli 17: a) Nicht-Capturing-Gruppen für bessere Leistung (und keine leeren Gruppen) und b) Unterstützung für JavaScript-Kommentare hinzugefügt.

10
spaark

Wann immer Sie auf Regex-basierte Skript-Tag-Bereinigung zurückgreifen müssen. Fügen Sie dem schließenden Tag mindestens ein Leerzeichen in der Form von hinzu 

</script\s*>

Ansonsten gefällt es

<script>alert(666)</script   >

würde bleiben, da nachgestellte Leerzeichen nach tagnames gültig sind.

10
neongrau

Warum nicht jQuery.parseHTML () http://api.jquery.com/jquery.parsehtml/ verwenden?

4
shao

In meinem Fall brauchte ich eine Anforderung, um den Seitentitel AND zu analysieren und alle anderen Eigenschaften von jQuery zu haben, abzüglich der Skripts. Hier ist meine Lösung, die zu funktionieren scheint.

        $.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());
        });

Diese Art von Verknüpfungen sorgt sich um das Skript, da Sie nicht versuchen, die Skript-Tags und -Inhalte zu entfernen. Stattdessen ersetzen Sie sie durch Kommentar-Rendering-Schemata, um sie unbrauchbar zu machen.

Lassen Sie mich wissen, ob dies immer noch ein Problem darstellt, da es mir auch helfen wird.

1
Jason Sebring

Wenn Sie den gesamten JavaScript-Code aus einem HTML-Text entfernen möchten, reicht es nicht aus, <script>-Tags zu entfernen, da JavaScript noch in "onclick", "onerror", "href" und anderen Attributen leben kann.

Probieren Sie dieses npm-Modul aus, das all das behandelt: https://www.npmjs.com/package/strip-js

1
Shivanshu Goyal

Du kannst es versuchen 

$("your_div_id").remove();  

oder

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

Hier finden Sie eine Vielzahl von Shell-Skripts, mit denen Sie verschiedene Elemente entfernen können.

# 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

Versuche dies:

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

/ (?: (?! </ s\w) <[^ <]) </ s\w */gi; - Entfernt eine beliebige Reihenfolge in beliebiger Kombination mit 

0
Blackening