2010-05-09 3 views
21

У меня есть QString с некоторым HTML в нем ... есть ли простой способ снять с него HTML? Я в основном хочу только фактическое текстовое содержимое.Есть ли простой способ удалить HTML из QString в Qt?

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

бы стать:

Test: A test case 

Я хотел бы знать, если Qt имеет функцию строки или утилиты для этого.

ответ

11

Вы можете попробовать выполнить итерацию по строке с помощью класса QXmlStreamReader и извлечь весь текст (если ваша строка HTML гарантируется, что она будет хорошо сформирована XML).

Что-то вроде этого:

QXmlStreamReader xml(htmlString); 
QString textString; 
while (!xml.atEnd()) { 
    if (xml.readNext() == QXmlStreamReader::Characters) { 
     textString += xml.text(); 
    } 
} 

, но я не уверен, что его 100% действует ussage из QXmlStreamReader API, так как я использовал это довольно Корда время назад и может что-то забыть.

+0

Спасибо. Я не пытаюсь проверить его или извлечь. Я просто хочу избавиться от него. –

+0

О, и текст, который я получаю *, является * из надежного источника (а не для пользователя), поэтому я должен быть в порядке. –

+0

Вы имели в виду 'textString' вместо' textStream'? –

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

Этот ответ будет недостаточным для строк с объектами HTML, например. < –

+1

Проблема с этим, с верхней части моей головы, заключается в том, что '
' удаляется, а не преобразуется в символ новой строки. – Marcus

+0

@Marcus Итак, что именно задал вопрос. Ни один из HTML не преобразуется ни в что, это совершенно другой запрос –

20

Если вы не заботитесь о производительности, что много, то QTextDocument делает очень хорошую работу преобразования HTML в обычный текст.

QTextDocument doc; 
doc.setHtml(htmlString); 

return doc.toPlainText(); 

Я знаю, что этот вопрос старый, но я искал быстрый и грязный способ обработки неправильного HTML. Парсер XML не давал хороших результатов.

+0

Я думаю, что это лучший ответ. Он сохраняет базовый формат, как разрывы. –

+3

Возможно, немного лучше было бы использовать 'QTextDocumentFragment': ' QString plainText = QTextDocumentFragment :: fromHtml (htmlString) .toPlainText(); ' – Marcus

+0

Вы должны сделать это реальным ответом, а не комментарием. Лучшее решение, я думаю. –

0

ситуация, когда некоторые html не совсем проверяют xml, ухудшают правильность ее работы.

Если это действительный xml (или не очень плохо сформированный), я думаю, что QXmlStreamReader + QXmlStreamEntityResolver может быть неплохой идеей.

Пример кода в: https://github.com/ycheng/misccode/blob/master/qt_html_parse/utils.cpp

(это может быть комментарий, но я до сих пор не имеют на это разрешение)

-3

этот ответ на который позже прочитал этот пост и с помощью Qt5 или более поздней версии , просто избегайте html-символов, используя встроенные функции, как показано ниже.

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

Я не хочу убегать от тегов, я хочу их удалить. –

+0

'QString :: toHtmlEscaped' не удаляет теги html.Просто преобразует символы, такие как '<', '>' и т. Д., В html-коды. – Marcus