Saltar al contenido

PHP DOMDocument reemplaza DOMElement child con HTML string

Mantén la atención ya que en este tutorial encontrarás el arreglo que buscas.Este tutorial fue analizado por nuestros especialistas para asegurar la calidad y veracidad de nuestro post.

Solución:

Si el HTML string se puede analizar como XML, puede hacer esto (después de borrar el elemento de todos los nodos secundarios):

$fragment = $doc->createDocumentFragment();
$fragment->appendXML($html_string);
$element->appendChild($fragment);

Si $html_string no se puede analizar como XML, fallará. Si es así, tendrá que usar loadHTML(), que es menos estricto, pero agregará elementos alrededor del fragmento que tendrá que eliminar.

A diferencia de PHP, Javascript tiene la propiedad innerHTML que le permite hacer esto muy fácilmente. Necesitaba algo así para un proyecto, así que amplié el DOMElement de PHP para incluir acceso a HTML interno similar a Javascript.

Con él, puede acceder a la propiedad innerHTML y cambiarla tal como lo haría en Javascript:

echo $element->innerHTML;
$elem->innerHTML = 'example';

Fuente: http://www.keyvan.net/2012/11/php-domdocument-replace-domelement-child-with-html-string/

La respuesta aceptada actual sugiere usar appendXML(), pero reconoce que no manejará html complejo como lo que devuelve un editor WYSISYG como se especifica en la pregunta original. Como se sugiere, loadHTML() puede abordar esto. pero nadie ha demostrado todavía cómo.

Esto es lo que creo que es la respuesta mejor/correcta a la pregunta original que aborda los problemas de codificación, las advertencias de “Fragmento de documento está vacío” y los errores de “Error de documento incorrecto” que es probable que alguien encuentre si escribe esto desde cero. Sé que los encontré después de seguir las pistas en las respuestas anteriores.

Este es un código de un sitio que admito que inserta el contenido de la barra lateral de WordPress en el $contenido de una publicación. Asume que $doc es un DOMDocument válido similar a la forma en que se define $doc en la pregunta original. También asume que $elemento es la etiqueta después de la cual desea insertar el contenido de la barra lateral (o lo que sea).

            // NOTE: Cannot use a document fragment here as the AMP html is too complex for the appendXML function to accept.
            // Instead create it as a document element and insert that way.
            $node = new DOMDocument();
            // Note that we must encode it correctly or strange characters may appear.
            $node->loadHTML( mb_convert_encoding( $sidebarContent, 'HTML-ENTITIES', 'UTF-8') );
            // Now we need to move this document element into the scope of the content document 
            // created above or the insert/append will be rejected.
            $node = $doc->importNode( $node->documentElement, true );
            // If there is a next sibling, insert before it.
            // If not, just add it at the end of the element we did find.
            if (  $element->nextSibling ) 
                $element->parentNode->insertBefore( $node, $element->nextSibling );
             else 
                $element->parentNode->appendChild($node);
            

Después de hacer todo esto, si no desea tener la fuente de un documento HTML completo con etiquetas de cuerpo y otras cosas, puede generar el html más localizado con esto:

    // Now because we have moved the post content into a full document, we need to get rid of the 
    // extra elements that make it a document and not a fragment
    $body = $doc->getElementsByTagName( 'body' );
    $body = $body->item(0);

    // If you need an element with a body tag, you can do this.
    // return $doc->savehtml( $body );

    // Extract the html from the body tag piece by piece to ensure valid html syntax in destination document
    $bodyContent = ''; 
    foreach( $body->childNodes as $node )  
            $bodyContent .= $body->ownerDocument->saveHTML( $node ); 
     
    // Now return the full content with the new content added. 
    return $bodyContent;

Si estás contento con lo expuesto, puedes dejar un enunciado acerca de qué te ha parecido este tutorial.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *