Удаление всех тегов script из html с регулярным выражением JS
Я хочу вырезать теги script из этого html в pastebin
http://pastebin.com/mdxygM0a
Я попытался использовать следующее регулярное выражение
html.replace(/<script.*>.*<\/script>/ims, " ")
Но он не удаляет все теги script в html. Он удаляет только встроенные скрипты. Мне нужно регулярное выражение, которое может удалить все теги script (в линию и многострочные). Было бы высоко оценено, если тест проводится на моем примере http://pastebin.com/mdxygM0a
Спасибо
Ответы
Ответ 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 >
останется после окончания пробелов после действительных тэгов.
Ответ 6
Почему бы не использовать jQuery.parseHTML() http://api.jquery.com/jquery.parsehtml/?
Ответ 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]()