Peringatan: DOMDocument :: loadHTML (): htmlParseEntityRef: mengharapkan ';' di Entitas,

90
$html = file_get_contents("http://www.somesite.com/");

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

echo $dom;

melempar

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
Catchable fatal error: Object of class DOMDocument could not be converted to string in test.php on line 10
gweg
sumber

Jawaban:

149

Untuk menguapkan peringatan, Anda bisa menggunakan libxml_use_internal_errors(true)

// create new DOMDocument
$document = new \DOMDocument('1.0', 'UTF-8');

// set error level
$internalErrors = libxml_use_internal_errors(true);

// load HTML
$document->loadHTML($html);

// Restore error level
libxml_use_internal_errors($internalErrors);
Dewsworld
sumber
93

Saya berani bertaruh bahwa jika Anda melihat sumbernya, http://www.somesite.com/Anda akan menemukan karakter khusus yang belum diubah ke HTML. Mungkin sesuatu seperti ini:

<a href="/script.php?foo=bar&hello=world">link</a>

Seharusnya

<a href="/script.php?foo=bar&amp;hello=world">link</a>
mattalxndr.dll
sumber
3
Hanya untuk memperluas ini, jika & karakter ada dalam teks dan bukan atribut HTML, itu masih perlu di-escape ke & amp ;. Alasan parser menampilkan kesalahan adalah karena setelah melihat & itu mengharapkan; untuk menghentikan entitas HTML.
Kyle
22
... dan untuk memperluas lebih jauh, memanggil htmlentities()atau serupa pada string akan memperbaiki masalah.
Ben
57
$dom->@loadHTML($html);

Ini salah, gunakan ini sebagai gantinya:

@$dom->loadHTML($html);
Maanas Royy
sumber
26
atau $ dom-> strictErrorChecking = false;
Tjorriemorrie
8
Ini adalah solusi yang buruk karena Anda akan membuat kesalahan pada baris ini menjadi mimpi buruk untuk di-debug. Solusi @ Dewsworld jauh lebih baik.
Gerry
apa @untuk?
Francisco Corrales Morales
3
Ini adalah solusi yang sangat kotor dan ini tidak akan memperbaiki semuanya.
Mirko Brunner
1
Meskipun jawaban Anda akan mengatasi masalah tersebut, baris "Ini salah" dengan sendirinya salah.
TecBrat
15

Ada 2 kesalahan: yang kedua adalah karena $ dom bukanlah string tetapi sebuah objek dan karenanya tidak dapat "di-echo". Kesalahan pertama adalah peringatan dari loadHTML, yang disebabkan oleh sintaks dokumen html yang tidak valid untuk dimuat (mungkin sebuah & (ampersand) digunakan sebagai pemisah parameter dan tidak disamarkan sebagai entitas dengan &).

Anda mengabaikan dan menahan pesan kesalahan ini (bukan kesalahan, hanya pesan!) Dengan memanggil fungsi dengan operator kontrol kesalahan "@" ( http://www.php.net/manual/en/language.operators.errorcontrol. php )

@$dom->loadHTML($html);
pengguna279583
sumber
12

Alasan kesalahan fatal Anda adalah DOMDocument tidak memiliki metode __toString () dan karenanya tidak dapat di-echo'ed.

Anda mungkin sedang mencari

echo $dom->saveHTML();
Mike B
sumber
10

Terlepas dari echo (yang perlu diganti dengan print_r atau var_dump), jika pengecualian dilemparkan, objek harus tetap kosong:

DOMNodeList Object
(
)

Larutan

  1. Setel recoverke benar, dan strictErrorCheckingsalah

    $content = file_get_contents($url);
    
    $doc = new DOMDocument();
    $doc->recover = true;
    $doc->strictErrorChecking = false;
    $doc->loadHTML($content);
    
  2. Gunakan pengkodean entitas php pada konten markup, yang merupakan sumber kesalahan paling umum.

Lorenz Lo Sauer
sumber
1
Pada solusi pertama Anda menulis dom, bukan doc.
Máthé Endre-Botond
ini berhasil untuk saya, saya hanya menambahkan $ content = mb_convert_encoding ($ content, 'HTML-ENTITIES', 'UTF-8');
Jacek Pietal
8

ganti yang sederhana

$dom->loadHTML($html);

dengan lebih kuat ...

libxml_use_internal_errors(true);

if (!$DOM->loadHTML($page))
    {
        $errors="";
        foreach (libxml_get_errors() as $error)  {
            $errors.=$error->message."<br/>";
        }
        libxml_clear_errors();
        print "libxml errors:<br>$errors";
        return;
    }
David Chan
sumber
8
$html = file_get_contents("http://www.somesite.com/");

$dom = new DOMDocument();
$dom->loadHTML(htmlspecialchars($html));

echo $dom;

coba ini

nmwi22
sumber
3

Solusi lain yang mungkin adalah

$sContent = htmlspecialchars($sHTML);
$oDom = new DOMDocument();
$oDom->loadHTML($sContent);
echo html_entity_decode($oDom->saveHTML());
lastYorsh
sumber
Ini tidak akan berhasil. Menurut php.net/manual/en/function.htmlspecialchars.php , semua karakter khusus html juga di-escape. Ambil contoh potongan kode HTML ini <span>Hello World</span>. Menjalankan ini htmlspecialcharsakan menghasilkan &lt;span&gt;Hello World&lt/span&gt;yang bukan HTML lagi. DOMDocument :: loadHTML tidak akan memperlakukannya sebagai HTML lagi tetapi sebagai string.
Twisted Whisper
Ini bekerja untuk saya:$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
Bartłomiej Jakub Kwiatek
3

Saya tahu ini pertanyaan lama, tetapi jika Anda ingin memperbaiki tanda '&' yang salah di HTML Anda. Anda dapat menggunakan kode yang mirip dengan ini:

$page = file_get_contents('http://www.example.com');
$page = preg_replace('/\s+/', ' ', trim($page));
fixAmps($page, 0);
$dom->loadHTML($page);


function fixAmps(&$html, $offset) {
    $positionAmp = strpos($html, '&', $offset);
    $positionSemiColumn = strpos($html, ';', $positionAmp+1);

    $string = substr($html, $positionAmp, $positionSemiColumn-$positionAmp+1);

    if ($positionAmp !== false) { // If an '&' can be found.
        if ($positionSemiColumn === false) { // If no ';' can be found.
            $html = substr_replace($html, '&amp;', $positionAmp, 1); // Replace straight away.
        } else if (preg_match('/&(#[0-9]+|[A-Z|a-z|0-9]+);/', $string) === 0) { // If a standard escape cannot be found.
            $html = substr_replace($html, '&amp;', $positionAmp, 1); // This mean we need to escape the '&' sign.
            fixAmps($html, $positionAmp+5); // Recursive call from the new position.
        } else {
            fixAmps($html, $positionAmp+1); // Recursive call from the new position.
        }
    }
}
Nicolas Bouvrette
sumber
0

Solusi lain yang mungkin adalah, mungkin file Anda adalah file jenis ASCII, ubah saja jenis file Anda.

JUJUR
sumber
-1

Bahkan setelah ini kode saya berfungsi dengan baik, jadi saya baru saja menghapus semua pesan peringatan dengan pernyataan ini di baris 1.

<?php error_reporting(E_ERROR); ?>
Satyam Gupta
sumber