2011-01-26 18 views
9

Estoy tratando de analizar un documento y obtener todas las etiquetas de imagen y cambiar el origen de algo diferente.php DomDocument agrega etiquetas adicionales

 

    $domDocument = new DOMDocument(); 

    $domDocument->loadHTML($text); 

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

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

    $text = $domDocument->saveHTML(); 
 

El texto inicialmente $ tiene el siguiente aspecto:


<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>

y este es el texto de salida $:


<!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>

Me estoy poniendo un montón de etiquetas adicionales (html, cuerpo , y el comentario en la parte superior) que realmente no necesito. ¿Alguna forma de configurar DOMDocument para evitar agregar estas etiquetas adicionales?

¡Gracias!

Respuesta

5

Desafortunadamente DomDocument está retrasado y no le permitirá hacer esto. Prueba esto:

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

debería leer: $ text = preg_replace ('/^ /', '', str_replace (array ('', '', '', ''), array ('', '', ' ',' '), $ domDocument-> saveHTML())); –

+0

'preg_replace', ¿en serio? – sglessard

-1

Si va a guardar como HTML, ¡debe esperar que se cree un documento HTML válido!

Hay otra opción: DOMDocument::saveXML tiene un parámetro opcional que le permite acceder al contenido XML de un elemento particular:

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

Esto supone que su contenido sólo tiene un elemento de p.

+0

en función de los elementos que se utilizan dentro del documento no es siempre una buena idea utilizar saveXML() para recuperar un HTML de código . El XML creado usará la abreviatura de todos los elementos sin contenido, lo que dañará el documento HTML (por ejemplo, '

10

Solo tiene que agregar 2 banderas al método loadHTML(): LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD. Es decir.

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

Ver 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; 

Salida:

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

Esto funcionó, debería ser la mejor respuesta. Gracias. – Lynnais

+0

Para mí que simplemente quita todo el html de allí. Mis párrafos ya no están. – Mike

+0

@Mike: Eso es imposible ya que el código no elimina nada. Quizás el HTML que tienes no sea completamente válido. Intente agregar 'libxml_use_internal_errors (true);' antes de inicializar el DOMDocument con '$ domDocument = new DOMDocument;'. –