如何使用C#从HTML页面中删除<script>标签?

Sta*_*ful 15 html javascript c#

<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>
Run Code Online (Sandbox Code Playgroud)

有没有办法在C#中修改上面的HTML文件并将其转换为这种格式:

<html>
    <head>
    </head>
</html>
Run Code Online (Sandbox Code Playgroud)

基本上我的目标是从HTML页面中删除所有JavaScript.我不知道什么是修改HTML文件的最佳方法.我想以编程方式进行,因为有数百个文件需要修改.

Jer*_*rry 26

它可以使用正则表达式完成:

Regex rRemScript = new Regex(@"<script[^>]*>[\s\S]*?</script>");
output = rRemScript.Replace(input, "");
Run Code Online (Sandbox Code Playgroud)

  • :D http://stackoverflow.com/questions/4683046/regular-expression-for-extracting-script-tags (2认同)
  • 值得通读一下 [XSS Filter Evasion Cheat Sheet](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet) 以了解工作脚本标签有多少格式化可能性 (2认同)

mck*_*ejm 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);
Run Code Online (Sandbox Code Playgroud)

  • - !该示例不会删除脚本标记,它会从头部删除所有元素. - !MemoryStream不是必需的.`doc.LoadHtml(sampleHtml);` (4认同)

jim*_*lan 6

我认为正如其他人所说,HtmlAgility包是最好的选择.我用它来刮去并去掉一些难以转角的箱子.但是,如果一个简单的正则表达式是你的目标,那么也许你可以试试<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>
Run Code Online (Sandbox Code Playgroud)

用法:

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

return newHtml; // etc etc
Run Code Online (Sandbox Code Playgroud)