2011-03-26 23 views
7

estoy añadiendo un hash #b a cada enlace a través de la clase DOMDocument.php DOMDocument añade <html> cabeceras con declaración DOCTYPE

 $dom = new DOMDocument(); 
     $dom->loadHTML($output); 

     $a_tags = $dom->getElementsByTagName('a'); 

     foreach($a_tags as $a) 
     { 
      $value = $a->getAttribute('href'); 
      $a->setAttribute('href', $value . '#b'); 
     } 

     return $dom->saveHTML(); 

que funciona bien, sin embargo la salida devuelta incluye una declaración DOCTYPE y una etiqueta de <head> y <body>. ¿Alguna idea de por qué sucede eso o cómo puedo evitar eso?

+0

posible duplicado de [PHP + DOMDocument:? OuterHTML para el elemento] (http://stackoverflow.com/questions/5404941/php-DOMDocument-outerHTML-de-elemento) – hakre

Respuesta

5

Eso es lo que hace DOMDocument::saveHTML() general, sí: generar un documento HTML completo, con la declaración DOCTYPE, la etiqueta <head>, ... soluciones

Dos posibles:

  • Si está trabajando con PHP > = 5.3, saveHTML() acepta un parámetro adicional que podría ayudarlo
  • Si necesita que su código para trabajar con PHP 5.3.6 <, que tendrá que utilizar un poco de str_replace() o expresiones regulares o lo que sea equivalente que se pueda imaginar para eliminar las porciones de código HTML que no es necesario.
    • Para un ejemplo, ver this note en las notas de los usuarios del manual.
+0

el segundo enlace funciona bien para mí - preg_replace solución es la clave! ¡gracias! – matt

+2

De nada :-) * (y los chicos que publican notas de los usuarios en las páginas del manual son más que las gracias que yo, en este caso ;-)) * –

+0

utilicé la primera opción, ya que estoy usando PHP> = 5.3 y funcionó muy bien. '$ doc-> saveHTML (false);' –

1

Adición $doc->saveHTML(false); no funcionará y se devolverá un error, ya que espera un nodo y no bool.

La solución que utiliza:

return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $doc->saveHTML()));

yo estoy usando PHP> 5,4

4

El verdadero problema es la forma en que se ha cargado el DOM. Use esto en su lugar: $html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

Voten la respuesta original here.

0

He resuelto este problema mediante la creación de nuevos DOMDocument y la copia de los nodos secundarios del original a la nueva.

function removeDocType($oldDom) { 
    $node = $oldDom->documentElement->firstChild 
    $dom = new DOMDocument(); 
    foreach ($node->childNodes as $child) { 
    $dom->appendChild($doc->importNode($child, true)); 
    } 
    return $dom->saveHTML(); 
} 

Así insted de utilizar

return $dom->saveHTML(); 

que utilizo:

return removeDocType($dom);