在不使用HtmlAgilityPack的情况下剥离HTML标记

时间:2012-08-04 04:55:29

标签: c# .net html regex

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

  • 事先并不知道文档是否包含HTML。
  • 很可能,任何HTML的格式都会很差。
  • 单个文档可能非常大,可能是几百兆字节。
  • 对于任何奇怪的原因,非HTML内容可能仍然会被尖括号所包含,因此沿着<.+/?>行的天真正则表达式是不行的。 (无论如何,剥离XML是不太理想的。)

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

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

使用正则表达式似乎是明显的候选者。但后来我记得this famous answer,这让我担心这不是一个好主意。但是这种dia骂的重点是解析,而不一定是愚蠢的标签剥离。那么正则表达式可以用于此目的吗?

假设这不是一个糟糕的主意,我们非常欢迎那些能够做好工作的正则表达式的建议。

2 个答案:

答案 0 :(得分:1)

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

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

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

拥有所有允许标记的列表并将其替换为正则表达式的第一部分,如<(tag1|tag2|...)可以带来更精确的解决方案,我担心从您的开始就无法找到确切的解决方案关于尖括号的假设,例如考虑<a href="test.html"> b<a </a> ......

之类的东西

修改

更新了正则表达式(比后者运行得更好),而且如果您需要删除代码我建议在第一次启动之前执行一些清理,例如替换<script.+?</script>什么都没有。

答案 1 :(得分:1)

我只是想在这里开箱即用,但你可以考虑利用像Microsoft Word或OpenOffice这样的东西。

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

虽然我没有尝试过,但我敢打赌,可以通过编程方式与OpenOffice进行交互,以实现类似的目标。