2010-02-28 17 views
8

Nel mio codice converto alcuni documenti in stile xls in html usando openoffice. Quindi analizzo le tabelle utilizzando xml_parser_create. Il problema è che openoffice crea oldschool html con i tag <BR> e <HR> non aperti, non crea doctypes e non cita gli attributi <TABLE WIDTH=4>.Analisi di HTML mal formattato in PHP

I parser di php che conosco non mi piacciono e producono errori di formattazione xml. La mia soluzione attuale è di eseguire alcune espressioni regolari sul file prima di analizzarlo, ma questo non è né bello né veloce.

Conosci un php-parser (si spera incluso), che non si cura di questi tipi di errori? O forse un modo veloce per sistemare un html "rotto"?

risposta

8

Una soluzione per "fissare" rotto HTML potrebbe essere quella di utilizzare HTMLPurifier(citando):

HTML Purifier è una libreria filtro di HTML conforme agli standard scritto in PHP.
HTML Purifier non solo rimuovere tutti i codici maligni (meglio conosciuto come XSS) con un fondo sottoposto a revisione contabile, whitelist ma permissiva sicuro, sarà anche assicurarsi che i documenti siano conformi agli standard


un'idea alternativa potrebbe essere quella di provare a caricare il codice HTML con DOMDocument::loadHTML(citando):

La funzione analizza il codice HTML contenuto nell'origine stringa. A differenza del caricamento del codice XML , il codice HTML non deve essere ben formato da caricare.

E se si sta tentando di caricare HTML da un file, vedere DOMDocument::loadHTMLFile.

+0

+1 per introduzione htmlpurifier. si può anche guardare http://simplehtmldom.sourceforge.net/. – Alexar

+0

Il depuratore è bello, ma sembra un po 'eccessivo per il problema. La stessa cosa vale per DOMParser. Non è corretto, che richiederà molto più tempo e ram di un semplice parser di sax? –

+0

Forse richiederà più RAM e possibilmente tempo; ma farà più di un semplice parsing SAX, che leggerà solo i dati e non lo riparerà ;;; e direi che un parser SAX sarà in grado di leggere solo XML valido - mentre HTMLPurifier e 'DOMDocument :: loadHTML' sono entrambi in grado di leggere l'HTML" danneggiato ". –

4

C'è SimpleHTML

Per la riparazione rotto HTML, è possibile utilizzare Tidy.

In alternativa è possibile utilizzare il numero nativo XML Reader. Poiché funge da cursore in avanti nel flusso del documento e si ferma in ogni nodo sulla strada, non si interromperà sui documenti XML non validi.

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

+1

+1 per Tidy. Trovo che sia più robusto al suo posto di SimpleHTML. 2 strumenti separati per 2 diversi lavori in realtà. – HappyTimeGopher

1

Qualche ragione particolare per cui stai ancora utilizzando l'API XML PHP 4?

Se riesci a farla franca con l'API XML di PHP 5, ci sono due possibilità.

Per prima cosa, prova il parser HTML incorporato. Non è molto buono (tende a soffocare su HTML formattato male), ma potrebbe fare il trucco. Dai un'occhiata a DomDocument :: LoadHTML.

Seconda opzione - si potrebbe provare il parser HTML basato sulla specifica parser HTML5:

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

Questo tende a lavorare meglio del built-in PHP parser HTML. Carica l'HTML in un oggetto DomDocument.

+0

Preferisco non usare un pars pars, in quanto il documento è abbastanza grande. (E ho già scritto tonnellate di codice per il sax) –

0

Una soluzione è utilizzare DOMDocument.

Esempio:

$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(); 

Vantaggio: nativamente inclusa in PHP, contrariamente a PHP ordinata.