1

我需要一种有效且(合理)可靠的方式从文档中去除 HTML 标记。它需要能够处理一些相当不利的情况:

  • 根本不知道文档是否包含 HTML。
  • 很可能,任何 HTML 的格式都会很差。
  • 单个文档可能非常大,可能有数百兆字节。
  • 无论出于什么奇怪的原因,非 HTML 内容可能仍然会充斥着尖括号,所以天真的正则表达式沿线是行不通的<.+/?>。(无论如何,剥离 XML 是不太可取的。)

我目前正在使用 HTML Agility Pack,它只是没有减少芥末。性能比我想要的要差,它并不总是尽可能优雅地处理真正糟糕的格式,最近我遇到了一些更令人不安的大文件的堆栈溢出问题。

我怀疑所有这些问题都源于它试图真正解析数据,这使得它不适合我的需求。我不想要语法树;我只想(大部分)标签消失。

使用正则表达式似乎是显而易见的选择。但后来我想起了这个著名的答案,这让我担心这不是一个好主意。但是那个谩骂的重点非常集中在解析上,而不一定是愚蠢的标签剥离。那么正则表达式可以用于此目的吗?

假设这不是一个糟糕的主意,非常欢迎对正则表达式提出好的建议。

4

2 回答 2

1

此正则表达式查找所有标签,避免标签中引号内的尖括号。

<[a-zA-Z0-9/_-]+?((".*?")|([^<"']+?)|('.*?'))*?>

它无法检测引号内的转义引号(但我认为在 html 中是不必要的)

拥有所有允许标签的列表并在正则表达式的第一部分替换它,就像<(tag1|tag2|...)可以带来更精确的解决方案一样,我担心从您对尖括号的假设开始无法找到确切的解决方案,例如思考到<a href="test.html"> b<a </a>...之类的东西

编辑

更新了正则表达式(性能比后者好很多),此外,如果您需要删除代码,我建议在第一次启动之前进行一些清理,比如<script.+?</script>什么都不做。

于 2012-08-16T15:02:31.120 回答
1

我只是在这里跳出框框思考,但您可以考虑利用 Microsoft Word 或 OpenOffice 之类的东西。

我使用Word 自动化将 HTML 翻译成 DOC、RTF 或 TXT。Word 原生的 HTML 到 TXT 转换将为您提供您想要的,剥离所有 HTML 标记并将其转换为文本格式。当然,如果您要处理大量微小的 HTML 文件,这根本不会有效,因为所有这些都会产生一些开销。但是,如果您要处理大量文件,这可能不是一个糟糕的选择,因为我确信 Word 对这些转换有很多优化。您可以通过在 Word 中手动打开一个最大的 HTML 文件并将其重新保存为 TXT 文件来测试该理论,然后查看 Word 需要多长时间来保存。

虽然我没有尝试过,但我敢打赌,可以通过编程方式与 OpenOffice 交互来完成类似的事情。

于 2012-08-16T15:14:39.413 回答