Вопрос по javascript, html, c# – Как удалить теги <script> со страницы HTML с помощью C #?

14
<html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript">
            if (window.self === window.top) { $.getScript("Wing.js"); }
        </script>
   </head>
</html>

Есть ли способ в C # изменить вышеуказанный HTML-файл и преобразовать его в этот формат:

<html>
    <head>
    </head>
</html>

По сути, моя цель - удалить весь код JavaScript со страницы HTML. Я не знаю, каков будет лучший способ изменить файлы HTML. Я хочу сделать это программно, поскольку существуют сотни файлов, которые необходимо изменить.

Смихит, будь очень осторожен с крайним случаем (который, если тебе повезет, ты не встретишься), о котором я упоминаю в своем ответе, где у тебя есть встроенный <script> внутри <script>, т.е.<script>var s = '<script></script>';</script>, это вызовет боль, так что посмотрите на варианты пакета ловкости или, по крайней мере, мое предложение<script(.+?)*</script>, Береги себя.. jim tollan

Ваш Ответ

5   ответов
8

HTML Agility Pack

Изменить: конкретный рабочий код

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
string sampleHtml = 
    "<html>" +
        "<head>" + 
                "<script type=\"text/javascript\" src=\"jquery.js\"></script>" +
                "<script type=\"text/javascript\">" + 
                    "if (window.self === window.top) { $.getScript(\"Wing.js\"); }" +
                "</script>" +
        "</head>" +
    "</html>";
MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(sampleHtml));

doc.Load(ms);

List<HtmlNode> nodes = new List<HtmlNode>(doc.DocumentNode.Descendants("head"));
int childNodeCount = nodes[0].ChildNodes.Count;
for (int i = 0; i < childNodeCount; i++)
    nodes[0].ChildNodes.Remove(0);
Console.WriteLine(doc.DocumentNode.OuterHtml);
- пример не удаляет тег script, он удаляет все элементы из головы. - MemoryStream не требуется.doc.LoadHtml(sampleHtml); kux
Что делать, если тег script не находится в голове? Jenny O'Reilly
Я согласен, но, возможно, вы могли бы быть более конкретным в своем ответе? Oscar Mederos
Просто замените вызов Descendants ("head") тем, с которого он будет происходить. «HTML» будет работать, если он расположен вне головы, я считаю, mckeejm
обновлено, чтобы добавить конкретный рабочий пример mckeejm
6

как уже говорили другие, HtmlAgility Pack - лучший путь. Я использовал это дляскрести и удалить грузытрудно загнать случаев. Однако, если вашей целью является простое регулярное выражение, то, возможно, вы могли бы попробовать<script(.+?)*</script>, Это удалит как неприятный вложенный javascript, так и обычный материал, то есть тип, указанный в ссылке (Регулярное выражение для извлечения тегов скрипта):

<html>
<head>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
        if (window.self === window.top) { $.getScript("Wing.js"); }
    </script>
    <script> // nested horror
    var s = "<script></script>";
    </script>
</head>
</html>

использование:

Regex regxScriptRemoval = new Regex(@"<script(.+?)*</script>");
var newHtml = regxScriptRemoval.Replace(oldHtml, "");

return newHtml; // etc etc
0

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

string result = Regex.Replace(
    input, 
    @"</?(?i:script|embed|object|frameset|frame|iframe|meta|link|style)(.|\n|\s)*?>", 
    string.Empty, 
    RegexOptions.Singleline | RegexOptions.IgnoreCase
);
Я попробовал это, и он удалил тег script - и все остальные теги в моем HTML. (У меня осталась только пустая строка) Nigel Ellis
1

Если вы не хотите использовать какую-либо стороннюю библиотеку для этого и вам не нужно фактически удалять код скрипта, просто отключите его, вы можете сделать это:

html = Regex.Replace(html , @"<script[^>]*>", "<!--");
html = Regex.Replace(html , @"<\/script>", "-->");

Это создает HTML-комментарий из тегов скрипта.

23

Regex rRemScript = new Regex(@"<script[^>]*>[\s\S]*?</script>");
output = rRemScript.Replace(input, "");
Обратите внимание, что это не соответствует<script>asdf</script> (без пробелов в открывающем теге), поэтому сценарии без объявленного типа не будут удалены. Кроме того, @ Джерри, почему совпадают[\s\S]* (то есть любые пробелы и любые не пробелы) внутри тега, а не.*? Jeremy
@ Джереми Да, вы правы, пробел в открывающем теге может быть удален. Для[\s\S]* это составляет\r а также\n, поскольку.* не делает. Jerry
Это работает для примера, приведенного выше. Я согласен с тем, что это не самый лучший способ, и следует использовать пакет agility для HTML. Но это работает. Спасибо за ответы на все вопросы StackOverflowVeryHelpful
В чем проблема? Если есть возможность для вложенных тегов скрипта, можно использовать Replace, в то время как Matches.Count> 0. Jerry
: Dstackoverflow.com/questions/4683046/... pax162

Похожие вопросы