【问题标题】:RegEx to Filter some specific tags正则表达式过滤一些特定的标签
【发布时间】:2015-09-19 04:06:05
【问题描述】:

我正在开发一个 ASP 代码,它可以读取外部网站并通过 HTMLDocument 接口对象(“HTMLFILE”对象)对其进行解析,以通过 DOM 结构导航内容。但是有些页面会抛出错误:

'htmlfile 错误 80070057 参数无效。'

经过大量研究,我发现有一些 HTML 标签,我不知道为什么,没有被 HTMLFILE 对象正确呈现或管理,给我这个错误。

因为 ASP 太老了,而且今天没有太多内容可供探索,我确信我必须在发送到 HTMLFILE 对象之前对其进行解析,而我认为最好的方法是通过 RegEx .

但我面临一些问题(而且因为我没有太多练习)。

我必须成功找到“HTMLFILE”不接受的 HTML 标记块才能将其删除。

例如:

<head>
<script> .......  </script>
<style> ....... </style>
</head>
<body>
<iframe> ........ </iframe>
<div> ..... </div>
<table>.....</table>

我必须匹配完整的脚本块、样式和 iframe,保持文档的其余部分完好无损。

从最近几天开始,我一直在做一些研究,并且几乎完成了:

<(?:script|embed|object|frameset|frame|iframe|meta|style).+(.|\s)*?>$

我尝试匹配单行标签(例如'
'),但我现在完全糊涂了,其中存在一些不一致之处,例如,关闭某些标签的某些行选择不正确。

我知道最好的方法是找出为什么 HTMLFILE 让我出错,但是没有更多关于错误的信息来调试它。

感谢所有的时间和耐心。

【问题讨论】:

    标签: html regex asp-classic


    【解决方案1】:

    这是正则表达式候选:

    <(script|meta|style|embed|object|frameset|frame|iframe)[\s\S]*?<\/(script|meta|style|embed|object|frameset|frame|iframe)>
    

    DEMO有解释

    编辑
    更新 [\s\S]*? 的惰性匹配

    【讨论】:

    • 我在一个带有多行块的巨大 html 代码上尝试过,但我不知道为什么,不起作用。
    • 已更新请重试 - 并包含正则表达式标志gmi
    • 然而,不能在多行块上工作,只在单行上工作!
    • @EduardoGarcia .* 将不匹配新行,请尝试使用 [\s\S]*? 而不是 .*... 无论如何,正则表达式并不是最好的工具
    • 现在我已经尝试使用@m.cekiera 提示并获得了不错的结果!表达式 有效,但是如果我在 前面有一个空格,这将选择另一行:(
    【解决方案2】:

    正则表达式不是最好的工具,take a look here,但如果你真的想要,我认为在简单的情况下你也可以对所有标签使用一个正则表达式,也可以嵌套:

    (?=(<([^>]+)>([\s\S]*?)<\/\2>))
    

    DEMO

    第 1 组显示整个捕获的部分,第 2 组仅捕获标记,第 3 组捕获标记的内容。它实际上并不匹配文本,只捕获一些片段。但是,您可能可以获得匹配的开始/结束索引,并根据需要使用。

    我仍然认为你应该重新考虑使用正则表达式,但是上面使用的 suntex 非常有用,所以值得知道如何使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2023-03-24
      • 2017-03-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多