2010-02-28 8 views
8

In meinem Code umwandeln ich einige gestylt xls-Dokument mit Openoffice HTML. ich analysieren dann die Tabellen xml_parser_create verwenden. Das Problem ist, dass OpenOffice oldschool html mit nicht geschlossenen <BR> und <HR> Tags erstellt, es erstellt keine Doctypes und keine Attribute <TABLE WIDTH=4>.Parsing von schlecht formatiert HTML in PHP

Die PHP-Parser, die ich kenne, mögen das nicht, und ergeben XML-Formatierungsfehler. Meine derzeitige Lösung besteht darin, einige Regexes über die Datei auszuführen, bevor ich sie analysiere, aber das ist weder schön noch schnell.

Kennen Sie einen (hoffentlich eingeschlossenen) php-Parser, der sich nicht um solche Fehler kümmert? Oder vielleicht ein schneller Weg, um einen 'kaputten' HTML zu reparieren?

Antwort

8

Eine Lösung zu "reparieren" broken HTML könnte HTMLPurifier(Zitat) zu verwenden:

HTML Purifier ist eine standardkonforme HTML-Filter-Bibliothek in PHP geschrieben.
HTML Purifier wird nicht nur entfernen sämtlichen schädlichen Code (besser bekannt als XSS) mit einer gründlich geprüft, sicher noch permissiven weißen Liste, es wird auch Ihre Dokumente sind standardkonform

stellen Sie sicher,
Eine alternative Idee könnte sein, Ihre HTML zu versuchen Laden mit DOMDocument::loadHTML(Zitat):

Die Funktion analysiert die HTML enthalten im String-Quelle. Im Gegensatz zum Laden XML, HTML muss nicht wohlgeformten zu laden sein.

Und wenn Sie versuchen, HTML aus einer Datei zu laden, siehe DOMDocument::loadHTMLFile.

+0

+1 für die Einführung htmlpurifier. kann man sich auch http://simplethmdom.sourceforge.net/ anschauen. – Alexar

+0

Der Luftreiniger ist nett, aber fühlt sich wie ein bisschen Overkill für das Problem an. Das Gleiche gilt für den DOMParser. Ist es nicht richtig, dass es viel mehr Zeit und Ram benötigt als ein einfacher Sax Parser? –

+0

Vielleicht wird es mehr RAM und möglicherweise Zeit benötigen; aber es wird mehr tun als ein einfaches SAX-Parse, das nur Daten lesen und nicht reparieren würde ;;; und ich würde sagen, dass ein SAX-Parser nur in der Lage ist, gültiges XML zu lesen - während HTMLPurifier und "DOMDocument :: loadHTML" beide in der Lage sind, "gebrochenes" HTML zu lesen. –

4

Es gibt SimpleHTML

Für gebrochene HTML Reparieren Sie Tidy nutzen könnten.

Als Alternative können Sie die native XML Reader verwenden. Weil es wirkt wie ein Cursor vorwärts auf dem Dokumentenstrom gehen und auf dem Weg an jedem Knoten zu stoppen, wird es nicht auf ungültige XML-Dokumente zu brechen.

Siehe http://www.ibm.com/developerworks/library/x-pullparsingphp.html

+1

+1 für sauber. Ich finde es ist robuster in seiner Arbeit als SimpleHTML. 2 separate Tools für 2 verschiedene Jobs wirklich. – HappyTimeGopher

1

einen besonderen Grund Sie die API PHP 4 XML noch mit sind?

Wenn Sie die XML-API von PHP 5 verwenden können, gibt es zwei Möglichkeiten.

Zuerst versuchen die integrierte HTML-Parser. Es ist wirklich nicht sehr gut (es neigt dazu, schlecht formatierten HTML zu ersticken), aber es könnte den Trick tun. Schauen Sie sich DomDocument :: LoadHTML an.

Zweite Option - Sie können den HTML-Parser versuchen, auf der Parser Spezifikation HTML5 basiert:

http://code.google.com/p/html5lib/

Dieser neigt dazu, besser zu arbeiten als der integrierten PHP-HTML-Parser. Es lädt den HTML-Code in ein DomDocument-Objekt.

+0

Ich würde lieber keinen dom-Parser verwenden, da das Dokument ziemlich groß ist. (Und ich habe schon Tonnen von Code für das Saxophon geschrieben) –

0

Eine Lösung ist die Verwendung von DOMDocument.

Beispiel:

$str = " 
<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
    </div>error. 
    <p>another error</i> 
</body> 
</html> 
"; 

$doc = new DOMDocument(); 
@$doc->loadHTML($str); 
echo $doc->saveHTML(); 

Vorteil: nativ in PHP enthalten, im Gegensatz zu PHP Tidy.