Подтвердить что ты не робот

Удаление всех тегов script из html с регулярным выражением JS

Я хочу вырезать теги script из этого html в pastebin

http://pastebin.com/mdxygM0a

Я попытался использовать следующее регулярное выражение

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

Но он не удаляет все теги script в html. Он удаляет только встроенные скрипты. Мне нужно регулярное выражение, которое может удалить все теги script (в линию и многострочные). Было бы высоко оценено, если тест проводится на моем примере http://pastebin.com/mdxygM0a

Спасибо

4b9b3361

Ответ 1

Попытка удалить разметку HTML с использованием регулярного выражения проблематична. Вы не знаете, что там script или значения атрибута. Один из способов - вставить его как innerHTML в div, удалить любые элементы script и вернуть innerHTML, например.

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

Обратите внимание, что в настоящее время браузеры не будут запускать script, если они вставляются с использованием свойства innerHTML, и, вероятно, никогда не будут особенно важны, поскольку элемент не добавлен в документ.

Ответ 2

jQuery использует регулярное выражение для удаления тегов script в некоторых случаях, и я уверен, что у его разработчиков была чертовски веская причина. Вероятно, некоторые браузеры выполняют сценарии при их вставке с помощью innerHTML.

Здесь регулярное выражение:

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

И прежде, чем люди начнут плакать, "но регулярные выражения для HTML злы": Да, они есть - но для тегов script они безопасны из-за особого поведения - раздел <script> не может содержать </script> вообще, если он не должен заканчиваться в этой позиции. Таким образом, легко сопоставить его с регулярным выражением. Однако при быстром просмотре регулярное выражение не учитывает конечные пробелы внутри закрывающего тега, поэтому вам нужно будет проверить, будет ли работать </script    и т.д.

Ответ 3

Regexes являются битными, но если у вас есть строковая версия HTML, которую вы не хотите вводить в DOM, они могут быть лучшим подходом. Вы можете поместить его в цикл, чтобы обработать что-то вроде:

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

Вот что я сделал, используя регулярное выражение jquery сверху:

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

Ответ 4

Это регулярное выражение тоже должно работать:

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

Это даже позволяет иметь "проблемные" переменные строки, подобные этим внутри:

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

Он швыряет, что jQuery и Prototype терпят неудачу на этих...

Редактировать 31 июля '17: Добавлено a) не захватывающие группы для лучшей производительности (и без пустых групп) и b) поддержка комментариев JavaScript.

Ответ 5

Всякий раз, когда вам приходится прибегать к исправлению тегов script на основе Regex. По крайней мере, добавьте пробел в закрывающий тег в форме

</script\s*>

В противном случае такие вещи, как

<script>alert(666)</script   >

останется после окончания пробелов после действительных тэгов.

Ответ 7

В моем случае мне нужно было требовать разобрать заголовок страницы И и иметь всю другую доброту jQuery, за исключением сценариев запуска. Вот мое решение, которое, похоже, работает.

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

Этот вид ярлыков беспокоится о script, потому что вы не пытаетесь удалить теги и содержимое script, вместо этого вы заменяете их схемами рендеринга комментариев, чтобы их бесполезно нарушать, поскольку у вас будут комментарии, ограничивающие ваш script объявления.

Сообщите мне, если это еще проблема, так как это мне тоже поможет.

Ответ 8

Вот несколько сценариев оболочки, которые вы можете использовать для выделения разных элементов.

# 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" {} \;

Ответ 9

/: </с\ш */г; ((</с\ш) < [^ & л]?!) - Удаляет любую последовательность в любой комбинации с помощью

Ответ 10

Если вы хотите удалить весь код JavaScript из некоторого HTML-текста, удаление тэгов <script> недостаточно, потому что JavaScript все еще может жить в "onclick", "onerror", "href" и других атрибутах.

Попробуйте этот модуль npm, который обрабатывает все это: https://www.npmjs.com/package/strip-js

Ответ 11

Вы можете попробовать

$("your_div_id").remove();  

или

 $("your_div_id").html(""); 

Ответ 12

Попробуйте следующее:

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

Ответ 13

Эта модифицированная версия работает очень хорошо:

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

enter image description here