2011-01-26 1 views
9

Sto cercando di analizzare un documento e ottenere tutti i tag immagine e cambiare la fonte per qualcosa di diverso.php DomDocument aggiunge tag extra

 

    $domDocument = new DOMDocument(); 

    $domDocument->loadHTML($text); 

    $imageNodeList = $domDocument->getElementsByTagName('img'); 

    foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
    } 

    $text = $domDocument->saveHTML(); 
 

Il $ testo appare inizialmente come questo:


<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>

e questo è l'output $ testo:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>

sto ricevendo un sacco di tag aggiunti (html, body e il commento in alto) di cui non ho veramente bisogno. Un modo per configurare il DOMDocument per evitare di aggiungere questi tag extra?

Grazie!

risposta

5

DomDocument è sfortunatamente ritardato e non ti consente di farlo. Prova questo:

$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML())); 
+1

dovrebbe leggere: $ text = preg_replace ('/^ /', '', str_replace (array ('', '', '', ''), array ('', '', ' ',' '), $ domDocument-> saveHTML())); –

+0

'preg_replace', davvero? – sglessard

-1

Se vuoi salvare come HTML, devi aspettarti di creare un documento HTML valido!

C'è un'altra opzione: DOMDocument::saveXML ha un parametro opzionale che consente di accedere al contenuto XML di un elemento particolare:

$el = $domDocument->getElementsByTagName('p')->item(0); 
$text = $domDocument->saveXML($el); 

Questo presuppone che il contenuto ha un solo elemento p.

+0

a seconda degli elementi utilizzati all'interno del documento, non è sempre una buona idea di utilizzare saveXML() per recuperare un HTML-source . L'XML creato utilizzerà la scorciatoia per tutti gli elementi senza contenuto, cosa danneggerà il documento HTML (ad esempio '

10

È sufficiente aggiungere 2 flag al metodo loadHTML(): LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD. Cioè

$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 

Vedi IDEONE demo:

$text = '<p>Hi, this is a test, here is an image<img src="http://example.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>'; 
$domDocument = new DOMDocument; 
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 
$imageNodeList = $domDocument->getElementsByTagName('img'); 

foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
} 

$text = $domDocument->saveHTML(); 
echo $text; 

uscita:

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p> 
+2

Questo ha funzionato, dovrebbe essere la migliore risposta. Grazie. – Lynnais

+0

Per me basta che toglie tutto l'html da lì. Anche i miei paragrafi sono spariti. – Mike

+0

@Mike: Questo è impossibile in quanto il codice non rimuove nulla. Forse l'HTML che hai non è pienamente valido. Prova ad aggiungere "libxml_use_internal_errors (true);" prima di inizializzare il DOMDocument con '$ domDocument = new DOMDocument;'. –