【发布时间】:2018-02-21 09:18:25
【问题描述】:
我需要输出消息中的所有纯文本,其中可能包括有效和/或无效的 HTML 以及可能与 HTML 表面上相似的文本(即<...> 中的非 HTML 文本,例如:< why would someone do this?? >)。
保留所有非 HTML 内容比去除所有 HTML 更重要,但理想情况下,我希望尽可能多地去除 HTML 以提高可读性。
我目前正在使用 HTML Agility Pack,但我遇到了 < 和 > 中的非 HTML 也被删除的问题,例如:
我的功能:
text = HttpUtility.HtmlDecode(text);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(text);
text = doc.DocumentNode.InnerText;
简单示例输入*:
this text has <b>weird < things</b> going on >
实际输出(不可接受,丢了“东西”二字):
this text has weird going on >
想要的输出:
this text has weird < things going on >
有没有办法只删除 HTML Agility Pack 中的合法 HTML 标签,而不会删除可能包括 < 和/或 > 的其他内容?或者我是否需要手动创建要删除的标签白名单,如this question?那是我的后备解决方案,但我希望 HTML Agility Pack(或其他工具)中内置了一个更完整的解决方案,我只是无法找到。
*(实际输入中通常包含大量不需要的 HTML,如果有用的话,我可以举一个更长的例子)
【问题讨论】:
-
处理损坏的 HTML 时,您将遇到缺陷。 HTMLAgilityPack 将
things解释为HTML 内容的一部分一点也不奇怪。当 HTML 无效时,库必须使用启发式进行猜测,而这些启发式并不完美。即使您像 Kevin 的回答那样编写自己的解析器,也不会变得更好。 -
我发现正则表达式
/<[^>]>/是查找和删除标签的好方法。所以Regex.Replace(input,"<[^>]>","")应该是一个很好的起点。尽管如此,如果可能的话,完全避免解析 HTML 会更好。
标签: c# html .net html-agility-pack