3

是否有任何可用的 C++(或者可能是 C)函数/类/库仅用于清理可能包含 HTML 的字符串?

我发现很多源代码用于在 C# 或 Web 应用程序中更常用的其他语言中进行清理,但在 C++ 中没有。

如果我找不到任何可用的功能,我会尝试实现我自己的功能,但我认为经过大量测试的解决方案会好得多。

编辑>我的需求更精确:

我在我的 C++ 应用程序中从键盘获取文本输入。然后我需要在将其用作 javascript 函数调用中的参数之前对其进行清理。该javascript在加载的html页面中运行,该页面自动呈现(通过Chromium)在我通过库(Navi)显示的纹理中。因此,我使用的 javascript 函数将简单地获取给定的文本,在文本周围放置 P 标签并将其注入到这样的 div 中:

text_display.innerHTML += text_to_add;

我需要在将文本发送到网页之前对其进行清理,无论是用于此功能还是其他功能。它只需要在输入 Chromium 之前进行消毒。

4

5 回答 5

6

HTML Tidy是用 c 编写的,但几乎所有语言/平台都有绑定,包括 c++

于 2009-04-19T00:29:11.653 回答
1

您可以使用libxml2 的xmlEncodeSpecialChars.

于 2009-04-24T02:17:59.637 回答
1

你在这里问了很多问题。在你得到一个好的答案之前,你需要清楚你想要从你的输入中“解析”出什么。例如,您可以查找任何“<”字符,并将它们转换为其他字符,这样它们就不会被任何 HTML 解析器解析。

或者,您可以搜索 < 和 > 的模式,然后是 </ > 模式。(对不起,我不得不把它放在这里,这样 HTML 解析器 HERE 就不会吃掉它)。然后,您还需要查找“< 单元素标签 />”。

您实际上可以查找有效/已知的 HTML 标记并将其删除。

那么,问题就变成了,哪种方法适合您的解决方案?知道如果您制作一个简单的解析器,您实际上可能会撕掉包含大于和小于符号的有效文本。

所以,到目前为止,这是我给你的答案。

如果您只想删除任何 HTML 风格的文本,我建议您使用正则表达式引擎 (PCRE),并使用它来解析您的输入,并删除所有匹配的字符串。这可能是一个简单的解决方案,但它确实需要您获取并构建 PCRE,并且您需要为您的项目了解 GPL 问题。解析可能真的很容易实现,并且运行速度很快。

第二种选择是通过遍历缓冲区,寻找打开的 HTML 字符 (<),然后解析直到遇到第一个空白,然后开始遍历,寻找关闭的 HTML 字符 (>),然后再次开始遍历,根据您刚刚解析的内容寻找匹配的 CLOSING 标记。(比如说,它是一个 DIV 标签,你要查找 /DIV。)

我有在 STL HTML 解析器中执行此操作的代码,但也有很多问题需要考虑走这条路。例如,您需要处理实体代码、IMG、P 和 BR 等单元素标签,仅举几例。

如果您想查看一些非常棒的 C 代码,请查看 ClamAV 项目。他们有一个 HTML 解析器,可以去除页面中的所有标签,只剩下剩下的文本。(除其他外它确实..)。在文件 libclamav\htmlnorm.c 中查看有关“缓冲行走”和解析的一个很好的示例。这不是世界上最快的东西,但它确实有效......最新的 Clam 甚至可能有很多东西与 HTML 解析器相关联,实际上可能很难理解。如果是这样,请返回并查看早期版本,例如 .88.4 左右。请注意那些旧代码库中的错误,有一些好的。:)

希望这可以帮助。

于 2009-04-24T19:07:11.007 回答
0

使用 Qt 的 QWebkit 并解析 HTML 树。然后用它吐出输出。这会稍微清理一下html。

于 2009-04-29T13:07:06.710 回答
-1

是几个小时前发布的。这只是一篇关于正则表达式的文章,但它恰好包含您想要的内容:) 我认为也可能很有趣。

于 2009-04-19T00:32:54.920 回答