$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
htmlentities()
atau serupa pada string akan memperbaiki masalah.$dom->@loadHTML($html);
Ini salah, gunakan ini sebagai gantinya:
@$dom->loadHTML($html);
sumber
@
untuk?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);
sumber
Alasan kesalahan fatal Anda adalah DOMDocument tidak memiliki metode __toString () dan karenanya tidak dapat di-echo'ed.
Anda mungkin sedang mencari
echo $dom->saveHTML();
sumber
Terlepas dari echo (yang perlu diganti dengan print_r atau var_dump), jika pengecualian dilemparkan, objek harus tetap kosong:
DOMNodeList Object ( )
Larutan
Setel
recover
ke benar, danstrictErrorChecking
salah$content = file_get_contents($url); $doc = new DOMDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTML($content);
Gunakan pengkodean entitas php pada konten markup, yang merupakan sumber kesalahan paling umum.
sumber
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; }
sumber
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom;
coba ini
sumber
Solusi lain yang mungkin adalah
$sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML());
sumber
<span>Hello World</span>
. Menjalankan inihtmlspecialchars
akan menghasilkan<span>Hello World</span>
yang bukan HTML lagi. DOMDocument :: loadHTML tidak akan memperlakukannya sebagai HTML lagi tetapi sebagai string.$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
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, '&', $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, '&', $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. } } }
sumber
Solusi lain yang mungkin adalah, mungkin file Anda adalah file jenis ASCII, ubah saja jenis file Anda.
sumber
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); ?>
sumber