在Qt中有没有一种简单的方法可以从QString中去除HTML?

30

我有一个包含HTML的QString字符串...有没有一种简单的方法可以从中去除HTML?我只想获取实际的文本内容。

<i>Test:</i><img src="blah.png" /><br> A test case

将变成:

Test: A test case

我想知道Qt是否有针对这个的字符串函数或实用工具。

5个回答

38
QString s = "<i>Test:</i><img src=\"blah.png\" /><br> A test case";
s.remove(QRegExp("<[^>]*>"));
// s == "Test: A test case"

1
这个答案对于包含HTML实体(例如<)的字符串不足够。 - Michael Platings
2
这个问题,我能想到的是,<br> 被删除而不是被转换为换行符。 - Marcus
@Marcus 正是问题所要求的。没有将任何HTML转换为其他内容,这是完全不同的请求。 - Michael Mrozek

32
如果您不太关心性能,那么QTextDocument可以很好地将HTML转换为纯文本。
QTextDocument doc;
doc.setHtml( htmlString );

return doc.toPlainText();

我知道这个问题很旧了,但是我正在寻找一种快速且简单的方法来处理不正确的HTML。XML解析器没有给出好的结果。


我认为这是最好的答案。它保留了基本格式,如换行符。 - Edwin Rodríguez
15
也许一个稍微更好的解决方案是使用 QTextDocumentFragmentQString plainText = QTextDocumentFragment::fromHtml(htmlString).toPlainText(); - Marcus
3
你应该把这变成一个真正的答案,而不是一个评论。我认为这是最好的解决方案。 - Tim Angus

14
你可以尝试使用 QXmlStreamReader 类逐个遍历字符串,并提取所有文本(如果你的 HTML 字符串确保为格式良好的 XML)。
类似以下代码:
QXmlStreamReader xml(htmlString);
QString textString;
while (!xml.atEnd()) {
    if ( xml.readNext() == QXmlStreamReader::Characters ) {
        textString += xml.text();
    }
}

但我不确定这是否是QXmlStreamReader API的100%有效用法,因为我使用它已经有一段时间了,可能会忘记一些细节。


谢谢。我不想验证它或提取它。我只是想摆脱它。 - Nathan Osman
哦,我获取的文本确实来自可信源(而非用户输入),所以应该没问题。 - Nathan Osman
当没有任何HTML标签时,它无法工作。因此,textString将为空字符串。 - Ivan Romanov

1

-5

这个答案是给那些后来阅读此帖并使用Qt5或更高版本的人。只需使用内置函数转义HTML字符,如下所示。

QString str="<h1>some hedding </h1>"; // a string containing html tags.
QString esc=str.toHtmlEscaped(); //esc contains the html escaped srring.

1
我不是想要避开标签,而是希望将它们移除。 - Nathan Osman
1
QString::toHtmlEscaped 不会删除 HTML 标签,只是将 <> 等字符转换为 HTML 代码。 - Marcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接