使用Regex删除JavaScript

我在使用C#从HTML页面删除所有javascript时遇到问题。 我有三个正则表达式删除了很多,但也错过了很多。 使用MSHTML DOM解析器解析javascript会导致javascript实际运行,这正是我试图通过使用正则表达式来避免的。

"" "]*>.*" "[\\s\\S]*?" 

有谁知道我错过了什么导致这三个正则表达式错过了JavaScript块?

我想要删除的一个例子:

       if(window['com.actions']) { window['com.actions'].approvalStatement = "", window['com.actions'].hasApprovalStatement = false }  

我假设您正在尝试简单地清理JavaScript的输入。 坦率地说,我担心这个解决方案太简单了,因为它看起来非常简单。 在表达式(在C#字符串中)之后,请参阅下面的推理:

 @"(?s)|)" 

就是这样 – 我希望! (这当然适用于你的例子!)

我对简单性的推理是,试图用正则表达式解析HTML的主要问题是嵌套标签的可能性 – 它不是DIFFERENT标签的嵌套,而是SYNONYMOUS标签的嵌套

例如,

  bold  AND italic  

……并不是那么糟糕,但是

  bold  AND italic  

解析会更难,因为结束标记是IDENTICAL。

但是,由于嵌套script标记无效,因此/> (<-is this valid?)或的下一个实例是此脚本块的结尾。

脚本标记内总是存在HTML注释或CDATA标记的可能性,但如果它们不包含则应该没问题。 但是:如果他们这样做,肯定有可能获得一些“代码”。 我不认为页面会呈现,但是一些HTML解析器非常灵活,所以你永远不会知道。 要处理一些额外可能的空格,你可以使用:

 @"(?s)<\s?script.*?(/\s?>|<\s?/\s?script\s?>)" 

请告诉我你是否可以找到一种方法来打破它,通过可运行的JavaScript让VALID HTML代码通过 (我知道有一些方法可以通过一些东西,但它应该被打破在许多不同的如果它通过的方式,并且不应该是可运行的JavaScript代码。)

人们普遍认为尝试使用正则表达式解析HTML是一个坏主意,并会产生不良结果。 相反,您应该使用DOM解析器。 jQuery在浏览器的DOM周围很好地包装,并允许您非常轻松地删除所有标记。

如果这样做是为了防止跨站点脚本,那么创建自己的HTML解析器或脚本检测器是一个特别糟糕的主意。 手动执行此操作是一个非常糟糕的主意,因为可以使用任何数量的角落案例和技巧来击败此类尝试。 这被称为“黑名单”,因为它试图从HTML中删除不安全的项目,而且它几乎注定要失败。

使用白名单处理器(例如AntiSamy )更安全,它只允许批准的项目通过自动转发其他所有内容。

当然,如果这不是您正在做的事情,那么您应该编辑您的问题以提供更多背景信息……

编辑:

现在我们知道您正在使用C#, 请按照此处的建议尝试HTMLAgilityPack 。

你使用哪种语言? 作为一般声明,正则表达式不适合解析HTML。

如果您使用的是.net平台,则HTML Agility Pack会提供更好的解析器。

您应该使用真正的html解析器来完成这项工作。 这就是说,简单的剥离
脚本块你可以使用如下的基本正则表达式。

这个想法是你需要一个回调来确定捕获组1是否匹配。
如果是这样,回调应该传回隐藏html(如注释)的东西
通过不变,脚本块作为空字符串传回。

但这并不能代替html处理器。 祝好运!

搜索正则表达式:(修饰符 – 扩展,全局,包括点中的换行符,回调函数)

  (?:  

替换func伪代码:

 string callback () { if capture buffer 1 matched return capt buffer 1 else return '' 

}

好吧,当我需要从任何可能的javascript中清除“富文本”(带有HTML格式的文本)时,我遇到了类似的情况。

有几种方法可以将JavaScript添加到HTML:

  • 使用

  • 通过在HTML元素上使用事件,例如“onload”或“onmouseover”ex:

  • 通过创建一个调用javascript代码的超链接ex: ...

这就是我现在所能想到的。

因此,需要从这3个案例中清除提交的HTML代码。 一个简单的解决方案是使用Regex查找这些模式,并用“”替换它们或者做任何你想做的事情。

这是一个简单的代码:

 public static string CleanHTMLFromScript(string str) { Regex re = new Regex("]*>", RegexOptions.IgnoreCase); str = re.Replace(str, ""); re = new Regex("<[az][^>]*on[az]+=\"?[^\"]*\"?[^>]*>", RegexOptions.IgnoreCase); str = re.Replace(str, ""); re = new Regex("]*>", RegexOptions.IgnoreCase); str = re.Replace(str, ""); return(str); } 

此代码处理可能添加或不添加的任何空格和引号。 它似乎工作正常,不完美,但它的确如此。 欢迎任何改进。