我无法使用 C# 从 HTML 页面中删除所有 javascript。我有三个正则表达式,它们删除了很多但也遗漏了很多。使用 MSHTML DOM 解析器解析 javascript 会导致 javascript 实际运行,这是我试图通过使用正则表达式来避免的。
"<script.*/>"
"<script[^>]*>.*</script>"
"<script.*?>[\\s\\S]*?</.*?script>"
有谁知道我遗漏了什么导致这三个正则表达式遗漏了 JavaScript block ?
我要删除的示例:
<script src="do_files/page.js" type="text/javascript"></script>
<script src="do_files/page.js" type="text/javascript" />
<script type="text/javascript">
<!--
var Time=new Application('Time')
//-->
</script>
<script type="text/javascript">
if(window['com.actions']) {
window['com.actions'].approvalStatement = "",
window['com.actions'].hasApprovalStatement = false
}
</script>
请您参考如下方法:
我假设您正在尝试简单地清理 JavaScript 的输入。坦率地说,我担心这个解决方案太简单了,因为它看起来太简单了。请参阅下面的推理,在表达式之后(在 C# 字符串中):
@"(?s)<script.*?(/>|</script>)"
就是这样 - 我希望! (它当然适用于您的示例!)
我的简单推理是尝试使用正则表达式解析 HTML 的主要问题是嵌套标签的可能性——与其说是不同标签的嵌套,不如说是同义标签的嵌套
例如,
<b> bold <i> AND italic </i></b>
...还不错,但是
<span class='BoldText'> bold <span class='ItalicText'> AND italic </span></span>
会更难解析,因为结束标签是相同的。
但是,由于嵌套script是无效的标签,/> 的下一个实例(<-这有效吗?)或 </script>是这个脚本 block 的结尾。
在脚本标签中总是可能有 HTML 注释或 CDATA 标签,但如果它们不包含 </script> 应该没问题.但是:如果他们这样做,肯定有可能获得一些“代码”。我不认为页面会呈现,但一些 HTML 解析器非常灵活,所以你永远不知道。要处理一些额外的可能空白,您可以使用:
@"(?s)<\s?script.*?(/\s?>|<\s?/\s?script\s?>)"
请让我知道您是否能想出一种方法来破解它,让有效的 HTML 代码具有可运行的 JavaScript(我知道有几种方法可以一些 东西通过了,但如果它确实通过了,它应该以许多不同的方式之一被破坏,并且不应该是可运行的 JavaScript 代码。)
