Удаление всех тегов скрипта из html с помощью регулярного выражения JS
Я хочу удалить теги скриптов из этого html в pastebin
Я попытался использовать ниже регулярное выражение
html.replace(/<script.*>.*</script>/ims, " ")
но он не удаляет все теги script в HTML. Он удаляет только встроенные скрипты. Пожалуйста, мне нужно регулярное выражение, которое может удалить все теги скрипта(In-line и multi-line). Было бы весьма признателен, если тест выполнен на моем примере http://pastebin.com/mdxygM0a
спасибо
12 ответов:
попытка удалить разметку HTML с помощью регулярного выражения проблематична. Вы не знаете, что там в качестве скрипта или значений атрибутов. Один из способов-вставить его как innerHTML div, удалить любые элементы скрипта и вернуть 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>') );обратите внимание, что в настоящее время браузеры не будут выполнять сценарий, если он будет вставлен с использованием свойства innerHTML, и, вероятно, никогда не будет, тем более, что элемент не добавляется в документ.
jQuery использует регулярное выражение для удаления тегов скриптов в некоторых случаях, и я уверен, что у его разработчиков была чертовски хорошая причина для этого. Наверное, какой-то браузер тут выполнение скриптов при их вставке с помощью
innerHTML.вот регулярное выражение:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/giи прежде чем люди начнут кричать "но регулярные выражения для HTML-это зло":Да, они - но для тегов скрипта они безопасны из - за особого поведения-a
<script>раздел не может содержать</script>at все, если только это не должно закончиться на этой позиции. Поэтому сопоставление его с регулярным выражением легко возможно. Однако, с быстрого взгляда регулярное выражение выше не учитывает конечные пробелы внутри закрывающего тега, поэтому вам придется проверить, если</scriptetc. все равно будет работать.
регулярные выражения можно использовать, но если у вас есть строковая версия 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, ""); }
это регулярное выражение должно работать:
<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: добавлены а) группы без захвата для повышения производительности (и без пустых групп) и Б) поддержка комментариев JavaScript.
всякий раз, когда вам приходится прибегать к очистке тегов на основе регулярных выражений. По крайней мере, добавьте пробел в закрывающий тег в виде
</script\s*>в противном случае такие вещи, как
<script>alert(666)</script >останется, так как конечные пробелы после tagnames действительны.
Почему бы не использовать jQuery.parseHTML() http://api.jquery.com/jquery.parsehtml/?
в моем случае мне нужно было требование, чтобы разобрать заголовок страницы и иметь все остальные достоинства 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()); });этот вид ярлыков беспокоится о скрипте, потому что вы не пытаетесь удалить теги и содержимое скрипта, вместо этого вы заменяете их схемами рендеринга комментариев, чтобы сломать их бесполезно, поскольку у вас будут комментарии, разделяющие ваши объявления скрипта.
Дай мне знайте, если это все еще представляет проблему, как это поможет мне тоже.
вот несколько сценариев оболочки, которые можно использовать для удаления различных элементов.
# 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\?[^>]*>\)//gi" {} \; # style text/css find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<style[^>]*\)\(\stype=[\"']text\/css[\"']\)\(\s\?[^>]*>\)//gi" {} \; # html xmlns find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxmlns=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)//gi" {} \; # html xml:lang find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxml:lang=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)//gi" {} \;
Если вы хотите удалить весь код JavaScript из некоторого HTML-текста, то удалите
<script>тегов недостаточно, потому что JavaScript все еще может жить в "onclick", "onerror", "href" и других атрибутах.попробуйте этот модуль npm, который обрабатывает все это: https://www.npmjs.com/package/strip-js
Comments