DOMDocument::loadHTML(): advertencia – htmlParseEntityRef: sin nombre en la entidad

6 minutos de lectura

Avatar de usuario de David Gard
David Gard

He encontrado varias preguntas similares, pero hasta ahora, ninguna ha podido ayudarme.

Estoy tratando de generar el ‘src’ de todas las imágenes en un bloque de HTML, así que estoy usando DOMDocument(). Este método realmente funciona, pero recibo una advertencia en algunas páginas y no puedo entender por qué. Algunas publicaciones sugirieron suprimir la advertencia, pero prefiero averiguar por qué se genera la advertencia.

Advertencia: DOMDocument::loadHTML(): htmlParseEntityRef: sin nombre en Entity, línea: 10

Un ejemplo de post->post_content que está generando el error es –

On Wednesday 21st November specialist rights of way solicitor Jonathan Cheal of Dyne Drewett will be speaking at the Annual Briefing for Rural Practice Surveyors and Agricultural Valuers in Petersfield.
<br>
Jonathan is one of many speakers during the day and he is specifically addressing issues of public rights of way and village greens.
<br>
Other speakers include:-
<br>
<ul>
<li>James Atrrill, Chairman of the Agricultural Valuers Associates of Hants, Wilts and Dorset;</li>
<li>Martin Lowry, Chairman of the RICS Countryside Policies Panel;</li>
<li>Angus Burnett, Director at Martin & Company;</li>
<li>Esther Smith, Partner at Thomas Eggar;</li>
<li>Jeremy Barrell, Barrell Tree Consultancy;</li>
<li>Robin Satow, Chairman of the RICS Surrey Local Association;</li>
<li>James Cooper, Stnsted Oark Foundation;</li>
<li>Fenella Collins, Head of Planning at the CLA; and</li>
<li>Tom Bodley, Partner at Batcheller Monkhouse</li>
</ul>

Puedo publicar algunos ejemplos más de lo que post->post_content contiene si eso sería útil?

He permitido el acceso a un sitio de desarrollo temporalmente, así que puedes ver algunos ejemplos [Note – links no longer accessable as question has been answered] –

¿Algún consejo sobre cómo resolver esto? Gracias.

$dom = new DOMDocument();
$dom->loadHTML(apply_filters('the_content', $post->post_content)); // Have tried stripping all tags but <img>, still generates warning
$nodes = $dom->getElementsByTagName('img');
foreach($nodes as $img) :
    $images[] = $img->getAttribute('src');
endforeach;

  • Mostrar la línea que causó el error definitivamente facilitaría la depuración.

    – algún día solitario

    1 de febrero de 2013 a las 14:27

  • ??? La advertencia está encendida DOMDocument::loadHTML();por lo que la línea que causa el error es dom->loadHTML(apply_filters('the_content', $post->post_content));

    – David Gard

    1 de febrero de 2013 a las 14:29

  • Línea 10 del contenido que está analizando…

    – algún día solitario

    1 de febrero de 2013 a las 14:40

  • Está bien contigo. En un caso, es James Cooper, Stnsted Oark Foundation;. Yo pensé que podría ser el ; causando el problema, pero repararlos todos (hubo varios antes) no ayudó.

    – David Gard

    1 de febrero de 2013 a las 14:43

  • @DavidGard Mi mejor conjetura entonces es que hay un ampersand sin escape (&) en algún lugar del HTML. Esto hará que el analizador piense que estamos en una referencia de entidad (por ejemplo, &copy;). cuando llega a ;, piensa que la entidad ha terminado. Luego se da cuenta de que lo que tiene no se ajusta a una entidad, por lo que envía una advertencia y devuelve el contenido como texto sin formato.

    – algún día solitario

    1 de febrero de 2013 a las 14:49

Esta respuesta correcta proviene de un comentario de @lonesomeday.

Entonces mi mejor conjetura es que hay un ampersand sin escape (&) en algún lugar del HTML. Esto hará que el analizador piense que estamos en una referencia de entidad (por ejemplo, ©). Cuando llega a ;, piensa que la entidad ha terminado. Luego se da cuenta de que lo que tiene no se ajusta a una entidad, por lo que envía una advertencia y devuelve el contenido como texto sin formato.

  • Entonces, ¿cómo lo arreglo? No puedo llamar a htmlentities en toda la cadena html.

    – MavWolverine

    9 de octubre de 2013 a las 2:05

  • @MavWolverine Sé que esto es muchos años después, pero me encontré con este mismo problema. La opción más simple que encontré fue simplemente hacer un reemplazo de cadena str_replace(' & ', ' &amp; ', $string) como htmlentities y htmlspecialcharacters causó el < y > de las etiquetas HTML a convertir. Ahora estoy 100% seguro de que hay una mejor manera de hacer esto, pero eso solucionó lo que necesitaba en un simple trabajo de análisis único.

    – PanPipes

    6 de febrero de 2020 a las 10:22

  • @PanPipes un poco más restrictivo: preg_replace("/&(?!\S+;)/", "&amp;", $string).

    – kagmole

    18 de noviembre de 2020 a las 9:52

  • Esto me salvó el día, estaba luchando y luego descubrí que los contenidos generados por un usuario incluyen & en un nombre y esa fue la fuente de todos los errores. Gracias

    – Efra

    4 de agosto de 2021 a las 19:19

Avatar de usuario de Ka.
Ka.

Como se menciona aquí

Advertencia: DOMDocument::loadHTML(): htmlParseEntityRef: esperando ‘;’ en entidad,

puedes usar :

libxml_use_internal_errors(true);

ver http://php.net/manual/en/function.libxml-use-errores-internos.php

  • Y cargando html como este @$dom->loadHTML($html); me ayuda.

    – Anil Chaudhari

    23 de agosto de 2018 a las 6:26


  • Esto solucionó mi problema

    – Derk Jan Speelman

    8 de marzo de 2019 a las 17:21

  • Genial, de nuevo stackoverflow me salvó 😉

    – prashant

    24 de abril de 2021 a las 16:49

Verifique el carácter “&” en su código HTML en cualquier lugar. Tuve ese problema debido a ese escenario.

  • y reemplazar & con &amp;

    – Digvijay

    8 de septiembre de 2020 a las 8:11

No tengo la reputación requerida para dejar un comentario arriba, pero usando htmlspecialchars resolvió este problema en mi caso:

$inputHTML = htmlspecialchars($post->post_content);
$dom = new DOMDocument();
$dom->loadHTML(apply_filters('the_content', $inputHTML)); // Have tried stripping all tags but <img>, still generates warning
$nodes = $dom->getElementsByTagName('img');
foreach($nodes as $img) :
    $images[] = $img->getAttribute('src');
endforeach;

Para mis propósitos, también estoy usando strip_tags($inputHTML, "<strong><em><br>")por lo que todas las etiquetas de imagen también se eliminan; de lo contrario, no estoy seguro de si esto sería un problema.

¡Aquí está mi solución!

 $html = preg_replace('/&(?!amp)/', '&amp;', $html);

Elimine el signo único, pero ‘&amp’ seguirá siendo el mismo.

avatar de usuario de yoorock.fr
yoorock.fr

Eventualmente resolví este problema de la manera correcta, usando tidy

// Configuration
$config = array(
    'indent'         => true,
    'output-xhtml'   => true,
    'wrap'           => 200);

// Tidy to avoid errors during load html
$tidy = new tidy;
$tidy->parseString($bill->bill_text, $config, 'utf8');
$tidy->cleanRepair();

$domDocument = new DOMDocument();
$domDocument->loadHTML(mb_convert_encoding($tidy, 'HTML-ENTITIES', 'UTF-8'));

Avatar de usuario de Apit John Ismail
Apit Juan Ismail

para laravel,

Utilice {{ }} en lugar de {!! !!}

Me enfrenté a esto y logré resolverlo.

¿Ha sido útil esta solución?