2016-04-01 13 views
0

Ich versuche HTML-Daten zu verarbeiten, die in einem QString enthalten sind. Die Daten haben codierte HTML-Tags, z. "<" etc. Ich möchte diese in die entsprechenden Symbole umwandeln.QString.replace funktioniert nicht

Ich habe versucht eine Reihe von Ansätzen, aber keiner scheint zu funktionieren, was darauf hindeutet, dass ich etwas wirklich einfaches vermisse.

Hier ist der Code (geändert durch die früheren Bemerkungen berichteten Fehler zu beheben):

QString theData = "&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; 
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; 
p, li { white-space: pre-wrap; } 
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Arial'; font-size:20pt; font-weight:400; font-style:normal;&quot;&gt; 
&lt;table border=&quot;0&quot; style=&quot;-qt-table-type: root; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;&quot;&gt; 
&lt;tr&gt; 
&lt;td style=&quot;border: none;&quot;&gt; 
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:14pt; color:#4cb8ff;&quot;&gt;This is text on the second page. This page contains a embedded image,&lt;/span&gt;&lt;/p&gt; 
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:14pt; color:#4cb8ff;&quot;&gt;and audio.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;"; 

QString t2 = theData.replace("&amp;", "&").replace("&lt;", "<").replace("&gt;", ">").replace("&quot;", "'"); 

Der Wert von T2 ist jedoch die gleiche wie theData nach dem ablöst.

+0

"t1..replace" <- Das sieht nicht wie gültige C++ - Syntax aus. – MrEricSir

Antwort

0

Es gibt keine Definition von t1 in Ihrem Code, ich nehme an, Sie meinen dieDaten (und keinen doppelten Punkt). Die QString :: Replace-Funktionen ändern den Wert der Zeichenfolge und geben eine Referenz davon zurück.

QString s = "abc"; 
s.replace("a", "z").replace("b", "z"); 
// s = "zzc"; 

// if you don't want to alter s 
QString s = "abc"; 
QString t = s; 
t.replace("a", "z").replace("b", "z"); 

Aber es gibt bessere Möglichkeit zu entkommen/unescape html Strings:

// html -> plain text 
QTextDocument doc; 
doc.setHtml(theData); 
QString t2 = doc.toPlainText(); 

// plain text -> html 
QString plainText = "#include <QtCore>" 
QString htmlText = plainText.toHtmlEscaped(); 
// htmlText == "#include &lt;QtCore&gt;" 

Wenn Sie nur HTML-Entities konvertieren wollen, verwende ich die folgende Funktion, die komplementär zu QString::toHtmlEscaped():

QString fromHtmlEscaped(QString html) { 
    html.replace("&quot;", "\"", Qt::CaseInsensitive); 
    html.replace("&gt;", ">", Qt::CaseInsensitive); 
    html.replace("&lt;", "<", Qt::CaseInsensitive); 
    html.replace("&amp;", "&", Qt::CaseInsensitive); 
    return html; 
} 

In allen Fällen sollte es halten str == fromHtmlEscaped(str.toHtmlEscaped()).

+0

Die Reihenfolge der Ersetzungen ist wichtig, das kaufmännische Und muss zuletzt ersetzt werden. Ich habe die Funktion in der Antwort bearbeitet, zögern Sie nicht, den Kommentar zu entfernen. Im Allgemeinen sollten Kommentare, die auf einen Mangel an einer Frage/Antwort hinweisen, durch die Festlegung bzw. Änderung der Frage/Antwort angesprochen werden. –

Verwandte Themen