DOMDocument::loadHTML(): Warnung – htmlParseEntityRef: kein Name in Entity

Lesezeit: 6 Minuten

David Gards Benutzeravatar
David Gard

Ich habe mehrere ähnliche Fragen gefunden, aber bisher konnte mir keine helfen.

Ich versuche, den ‘src’ aller Bilder in einem HTML-Block auszugeben, also verwende ich DOMDocument(). Diese Methode funktioniert tatsächlich, aber ich erhalte auf einigen Seiten eine Warnung, und ich kann nicht herausfinden, warum. In einigen Beiträgen wurde vorgeschlagen, die Warnung zu unterdrücken, aber ich möchte lieber herausfinden, warum die Warnung generiert wird.

Warnung: DOMDocument::loadHTML(): htmlParseEntityRef: kein Name in Entity, Zeile: 10

Ein Beispiel dafür post->post_content das den Fehler erzeugt, ist –

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>

Ich kann noch ein paar weitere Beispiele dafür posten post->post_content enthält, ob das hilfreich wäre?

Ich habe den Zugriff auf eine Entwicklungsseite vorübergehend zugelassen, sodass Sie einige Beispiele sehen können [Note – links no longer accessable as question has been answered] –

Irgendwelche Tipps, wie man das Problem lösen kann? Danke.

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

  • Das Anzeigen der Zeile, die den Fehler verursacht hat, würde das Debuggen definitiv erleichtern.

    – einsamer Tag

    1. Februar 2013 um 14:27

  • ??? Die Warnung ist eingeschaltet DOMDocument::loadHTML();also ist die Zeile, die den Fehler verursacht dom->loadHTML(apply_filters('the_content', $post->post_content));

    – David Gard

    1. Februar 2013 um 14:29

  • Zeile 10 des Inhalts, den Sie analysieren …

    – einsamer Tag

    1. Februar 2013 um 14:40 Uhr

  • Ok, mit dir. In einem Fall ist es so James Cooper, Stnsted Oark Foundation;. Ich dachte, es könnte daran liegen ; Das hat das Problem verursacht, aber es hat nicht geholfen, sie alle auszutauschen (es gab vorher mehrere).

    – David Gard

    1. Februar 2013 um 14:43

  • @DavidGard Meine beste Vermutung ist dann, dass es ein kaufmännisches Und-Zeichen ohne Escapezeichen gibt (&) irgendwo im HTML. Dies lässt den Parser denken, dass wir uns in einer Entitätsreferenz befinden (z. B &copy;). Wenn es soweit ist ;, es denkt, dass die Entität vorbei ist. Dann erkennt es, dass das, was es hat, nicht mit einer Entität übereinstimmt, sendet also eine Warnung und gibt den Inhalt als Klartext zurück.

    – einsamer Tag

    1. Februar 2013 um 14:49

Diese richtige Antwort stammt aus einem Kommentar von @lonesomeday.

Meine beste Vermutung ist dann, dass es irgendwo im HTML ein kaufmännisches Und-Zeichen (&) ohne Escapezeichen gibt. Dies lässt den Parser denken, dass wir uns in einer Entitätsreferenz befinden (z. B. ©). Wenn es ; erreicht, geht es davon aus, dass die Entität vorbei ist. Dann erkennt es, dass das, was es hat, nicht mit einer Entität übereinstimmt, sendet also eine Warnung und gibt den Inhalt als Klartext zurück.

  • Wie kann ich das Problem beheben? Ich kann htmlentities nicht für die gesamte HTML-Zeichenfolge aufrufen.

    – MavWolverine

    9. Okt. 2013 um 2:05

  • @MavWolverine Ich weiß, das ist viele Jahre später, aber ich bin gerade auf dasselbe Problem gestoßen. Die einfachste Option, die ich gefunden habe, bestand darin, einfach eine Zeichenfolge zu ersetzen str_replace(' & ', ' &amp; ', $string) als htmlentities Und htmlspecialcharacters verursachte das < Und > der zu konvertierenden HTML-Tags. Jetzt bin ich mir zu 100 % sicher, dass es einen besseren Weg gibt, dies zu tun, aber das hat alles erledigt, was ich für einen einfachen, einmaligen Parse-Job brauchte.

    – Panflöte

    6. Februar 2020 um 10:22

  • @PanPipes etwas restriktiver: preg_replace("/&(?!\S+;)/", "&amp;", $string).

    – kagmole

    18. November 2020 um 9:52 Uhr

  • Das rettet mir den Tag, ich hatte Probleme und stellte später fest, dass die von einem Benutzer generierten Inhalte & in einem Namen enthalten und das die Ursache aller Fehler war. Danke

    – Ephra

    4. August 2021 um 19:19 Uhr

Ka.s Benutzeravatar
Ka.

Wie hier erwähnt

Warnung: DOMDocument::loadHTML(): htmlParseEntityRef: erwartet ‘;’ in Entität,

Sie können Folgendes verwenden:

libxml_use_internal_errors(true);

sehen http://php.net/manual/en/function.libxml-use-internal-errors.php

  • Und HTML so laden @$dom->loadHTML($html); hilft mir.

    – Anil Chaudhari

    23. August 2018 um 6:26


  • Das hat mein Problem behoben

    – Derk Jan Speelman

    8. März 2019 um 17:21 Uhr

  • Großartig, wieder hat mich Stackoverflow gerettet 😉

    – prashant

    24. April 2021 um 16:49 Uhr

Ich verfüge nicht über den nötigen Ruf, um oben einen Kommentar zu hinterlassen, aber ich verwende htmlspecialchars hat dieses Problem in meinem Fall gelöst:

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

Für meine Zwecke verwende ich auch strip_tags($inputHTML, "<strong><em><br>")daher werden auch alle Bild-Tags entfernt – ich bin mir nicht sicher, ob dies sonst ein Problem wäre.

Überprüfen Sie das Zeichen „&“ irgendwo in Ihrem HTML-Code. Aufgrund dieses Szenarios hatte ich dieses Problem.

Nays Benutzeravatar
Nein

Ein nicht maskiertes „&“ irgendwo im HTML und ersetzen Sie „&“ durch &amp. Hier ist meine Lösung!

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

Das einzelne kaufmännische Und wird durch „&amp“ ersetzt, das aktuelle „&amp“ bleibt jedoch unverändert.

Benutzeravatar von yoorock.fr
yoorock.fr

Letztendlich habe ich dieses Problem richtig gelöst, indem ich Tidy verwendet habe

// 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'));

Apit John Ismails Benutzeravatar
Apit John Ismail

Für Laravel,

Verwenden Sie {{ }} anstelle von {!! !!}

Ich habe mich damit auseinandergesetzt und es geschafft, es zu lösen.

1452350cookie-checkDOMDocument::loadHTML(): Warnung – htmlParseEntityRef: kein Name in Entity

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy