2011-01-24 10 views
5

Sto cercando di analizzare uno snippet HTML, utilizzando le funzioni DOM PHP. Ho messo a nudo tutto tranne i tag di paragrafo, span e line break, e ora voglio recuperare tutto il testo, insieme ai suoi stili di accompagnamento.Come posso trovare i nodi di testo in uno snippet HTML?

Quindi, mi piacerebbe ottenere ogni pezzo di testo, uno per uno, e per ognuno posso quindi risalire l'albero per ottenere i valori di particolari attributi (mi interessano solo alcuni specifici , come il colore ecc.).

Come posso fare questo? O ci sto pensando nel modo sbagliato?

Grazie!

+0

Il codice potrebbe essere qualsiasi cosa (beh, entro limiti ragionevoli). Viene da TinyMCE e poi sto eliminando tutto, a parte gli span e i paragrafi. – Sharon

+0

si prega di mostrare il * codice DOM PHP * che si utilizza sull'ingresso * proveniente da TinyMCE * – Gordon

+0

Attualmente non sto facendo nulla - non è ancora arrivato lontano! Sto cercando di capire da dove cominciare! – Sharon

risposta

9

Supponiamo di avere un DOMDocument qui:

$doc = new DOMDocument(); 
$doc->loadHTMLFile('http://stackoverflow.com/'); 

si possono trovare tutti i nodi di testo utilizzando un semplice XPath.

$xpath = new DOMXpath($doc); 
$textNodes = $xpath->query('//text()'); 

Basta foreach su di essa per iterare su tutti i textnodes:

foreach ($textNodes as $textNode) { 
    echo $textNode->data . "\n"; 
} 

Da questo, si può salire l'albero del DOM utilizzando ->parentNode.

Spero che questo possa darti un buon inizio.

+1

Grazie, è esattamente ciò di cui avevo bisogno! Penso di poterlo capire da qui, ma potrei tornare con altre domande! – Sharon

3

Per coloro che sono più a proprio agio con i selettori CSS3 e sono disposti a includere una singola classe PHP aggiuntiva nel loro progetto, suggerirei l'uso di Simple PHP DOM parser. La soluzione sarebbe simile alla seguente:

$html = file_get_html('http://www.example.com/'); 

$ret = $html->find('p, span');  
$store = array(); 

foreach($ret as $element) { 
    $store[] = array($element->tag => array('text' => $element->innertext, 
              'color' => $element->color, 
              'style' => $element->style)); 
} 
print_r($store); 
+0

Alternative di terze parti suggerite a [SimpleHtmlDom] (http://simplehtmldom.sourceforge.net/) che in realtà utilizzano [DOM] (http://php.net/manual/en/book.dom.php) anziché Parsing delle stringhe : [phpQuery] (http://code.google.com/p/phpquery/), [Zend_Dom] (http://framework.zend.com/manual/en/zend.dom.html), [QueryPath] (http://querypath.org/) e [FluentDom] (http://www.fluentdom.org). – Gordon

+0

SimpleHtmlDom utilizza l'analisi delle stringhe? Questo è qualcosa che non sapevo. – karim79

+0

dai un'occhiata alla sua fonte;) – Gordon

Problemi correlati