Cómo mantener caracteres especiales UTF-8 y Emojis en tu HTML manipulado por la clase DOMDocument de PHP

Cómo mantener caracteres especiales UTF-8 y Emojis en tu HTML manipulado por la clase DOMDocument de PHP

Hace un par de meses, tuve que modificar dinámicamente todos los artículos del blog para incluir la función de carga diferida en las imágenes de los artículos que se escribieron hace un par de años. Usé la duramente criticada clase DOMDocument de PHP para hacer el trabajo y terminé descubriendo por qué es tan odiada. Además de no analizar correctamente los elementos HTML5, tendrás un problema con la codificación de caracteres en la mayoría de los casos con caracteres especiales y emojis, por ejemplo, verifica el siguiente código PHP que simplemente debería analizar el HTML dado e imprimirlo nuevamente, sin hacer absolutamente nada mas:

<?php

$html = <<<EOF
<html>
    <body>
        <p>Entwickeln Sie mit Vergnügen.</p>
        <p>
            Герой Лентул
            любит лежебочить;
            Зато ни в чём другом нельзя его порочить:
            Не зол, не сварлив он, отдать последне рад
            И если бы не лень, в мужьях он был бы клад;
            Приветлив и учтив, при том и не невежа,
            Рад сделать всё добро, да только бы лишь лежа.
        </p>
        <pre><code class="language-treeview">
            C:.
            └───Depix
                ├───depixlib
                │   └───__pycache__
                ├───docs
                │   └───img
                ├───example
                └───images
                    ├───searchimages
                    └───testimages
        </code></pre>
        <p>Happy coding ❤️!</p>
    </body>
</html>
EOF;

// Crea una instancia de DOMDocument
$doc = new DOMDocument();

// Carga tu HTML plano
$doc->loadHTML($html);

// Imagina que modificas algunas cosas del HTML y así sucesivamente ...
// Y finalmente decides exportarlo usando saveHTML
$finalHTML = $doc->saveHTML();

// Imprime la salida en el navegador
echo $finalHTML;

El contenido impreso por la última línea, extraído del método saveHTML del DOMDocument estropeará la salida del HTML del documento, al igual que la primera imagen del artículo. Si también lo pruebas, no se parecerá en nada al HTML que te proporcionamos al principio, ¿no es así? En este artículo, te mostraré algunas opciones que puedes utilizar para exportar correctamente el HTML analizado por la clase DOMDocument de PHP.

A. utf8_decode el elemento documentElement

En esta implementación, se usará el mismo código que de costumbre, sin embargo, asegúrate de pasar como primer argumento del método saveHTML, el modelo de documento actual, y usa utf8_decode para convertir la cadena con caracteres ISO-8859-1 codificados con UTF-8 :

<?php

$html = <<<EOF
<html>
    <body>
        <p>Entwickeln Sie mit Vergnügen.</p>
        <p>
            Герой Лентул
            любит лежебочить;
            Зато ни в чём другом нельзя его порочить:
            Не зол, не сварлив он, отдать последне рад
            И если бы не лень, в мужьях он был бы клад;
            Приветлив и учтив, при том и не невежа,
            Рад сделать всё добро, да только бы лишь лежа.
        </p>
        <pre><code class="language-treeview">
            C:.
            └───Depix
                ├───depixlib
                │   └───__pycache__
                ├───docs
                │   └───img
                ├───example
                └───images
                    ├───searchimages
                    └───testimages
        </code></pre>
        <p>Happy coding ❤️!</p>
    </body>
</html>
EOF;

// Crea una instancia de DOMDocument
$doc = new DOMDocument();

// Cargue tu HTML plano
$doc->loadHTML($html);

// utf8_decode convierte una cadena con caracteres ISO-8859-1 codificados con UTF-8 a ISO-8859-1 de un solo byte
// Proporcionaremos como primer argumento del método saveHTML, el documentElement actual
// Imagina que modificas algunas cosas del HTML y así sucesivamente ...
// Y finalmente decide exportarlo usando saveHTML
$finalHTML = utf8_decode($doc->saveHTML($doc->documentElement));

// ¡Imprime la salida en el navegador!
echo $finalHTML;

B. Utiliza el truco de SmartDocument

La clase SmartDocument es una clase que supera algunas molestias comunes con la clase DOMDocument de PHP. El código fuente del proyecto se puede encontrar en este repositorio en Github . No necesitarás incluir la clase en tu documento, pero tal como especifica el código de SmartDocument mientras cargas el HTML, antes de cargarlo en DOMDocument, la codificación HTML debe cambiarse usando mb_convert_encoding tal como lo haremos en el siguiente ejemplo:

<?php

$html = <<<EOF
<html>
    <body>
        <p>Entwickeln Sie mit Vergnügen.</p>
        <p>
            Герой Лентул
            любит лежебочить;
            Зато ни в чём другом нельзя его порочить:
            Не зол, не сварлив он, отдать последне рад
            И если бы не лень, в мужьях он был бы клад;
            Приветлив и учтив, при том и не невежа,
            Рад сделать всё добро, да только бы лишь лежа.
        </p>
        <pre><code class="language-treeview">
            C:.
            └───Depix
                ├───depixlib
                │   └───__pycache__
                ├───docs
                │   └───img
                ├───example
                └───images
                    ├───searchimages
                    └───testimages
        </code></pre>
        <p>Happy coding ❤️!</p>
    </body>
</html>
EOF;

// Crea una instancia de DOMDocument
$doc = new DOMDocument();

// Carga tu HTML plano, sin embargo con el
// Convierte la codificación de caracteres de $ html a HTML-ENTITIES de opcionalmente UTF-8.
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));

// Imagina que modificas algunas cosas del HTML y así sucesivamente ...
// Y finalmente decide exportarlo usando saveHTML
$finalHTML = $doc->saveHTML();

// ¡Imprime la salida en el navegador!
echo $finalHTML;

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable