我需要一种有效且(合理)可靠的方法来从文档中删除HTML标记。它需要能够处理一些相当不利的情况:
<.+/?>
行的天真正则表达式是不行的。 (无论如何,剥离XML是不太理想的。)我目前正在使用HTML Agility Pack,它并没有削减芥末。性能比我想要的要差,它并不总是尽可能优雅地处理真正糟糕的格式化,最近我遇到了一些更令人烦恼的大文件堆栈溢出的问题。
我怀疑所有这些问题源于它试图实际解析数据的事实,这使得它不适合我的需求。我不想要语法树;我只想(大部分)标签消失。
使用正则表达式似乎是明显的候选者。但后来我记得this famous answer,这让我担心这不是一个好主意。但是这种dia骂的重点是解析,而不一定是愚蠢的标签剥离。那么正则表达式可以用于此目的吗?
假设这不是一个糟糕的主意,我们非常欢迎那些能够做好工作的正则表达式的建议。
答案 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进行交互,以实现类似的目标。