Ответ 1
Это можно сделать с помощью regex:
Regex rRemScript = new Regex(@"<script[^>]*>[\s\S]*?</script>");
output = rRemScript.Replace(input, "");
<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>
Есть ли способ в С#, чтобы изменить указанный выше html файл и преобразовать его в формат, показанный ниже.
<html>
<head>
</head>
</html>
В основном моя цель - удалить все javascript, добавленные на html-страницы. Не знаю, какой должен быть лучший способ изменить эти html файлы. Я хочу сделать это программно, так как есть сотни файлов, которые нуждаются в модификации
Это можно сделать с помощью regex:
Regex rRemScript = new Regex(@"<script[^>]*>[\s\S]*?</script>");
output = rRemScript.Replace(input, "");
Возможно стоит посмотреть: 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);
Я думаю, как говорили другие, HtmlAgility pack - лучший маршрут. Я использовал это, чтобы очистить и удалить множество жестких дел. Однако, если простое регулярное выражение является вашей целью, возможно, вы можете попробовать <script(.+?)*</script>
. Это удалит неприятный вложенный javascript, а также обычный материал, то есть тип, упомянутый в ссылке (Regular Expression for Extracting Script Tags):
<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
Это может показаться странным решением.
Если вы не хотите использовать какую-либо стороннюю библиотеку для этого и не нужно действительно удалять код script, просто отключите его, вы можете сделать это:
html = Regex.Replace(html , @"<script[^>]*>", "<!--");
html = Regex.Replace(html , @"<\/script>", "-->");
Это создает комментарий HTML из тегов script.
с помощью regex:
string result = Regex.Replace(
input,
@"</?(?i:script|embed|object|frameset|frame|iframe|meta|link|style)(.|\n|\s)*?>",
string.Empty,
RegexOptions.Singleline | RegexOptions.IgnoreCase
);