Uyarı: DOMDocument :: loadHTML (): htmlParseEntityRef: bekleniyor ';' Varlık içinde,


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

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

echo $dom;

atar

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

Yanıtlar:


149

Uyarıyı buharlaştırmak için kullanabilirsiniz 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);

93

Kaynağına http://www.somesite.com/bakarsanız, HTML'ye dönüştürülmemiş özel karakterler bulacağınıza bahse girerim . Belki bunun gibi bir şey:

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

Olmalı

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

3
Bunu genişletmek için, eğer & karakteri bir HTML niteliği değil de metinde bile olsa, yine de & amp; 'ye kaçması gerekir. Ayrıştırıcının hatayı atmasının nedeni, bir & gördükten sonra a; HTML varlığını sonlandırmak için.
Kyle

22
... ve daha fazla genişletmek htmlentities()için, dizede arama veya benzeri bir şey sorunu çözecektir.
Ben

57
$dom->@loadHTML($html);

Bu yanlış, bunun yerine şunu kullanın:

@$dom->loadHTML($html);

26
veya $ dom-> tightErrorChecking = false;
Tjorriemorrie

8
Bu, bu hattaki hataları ayıklamak için bir kabusa çevireceğiniz için korkunç bir çözüm. @ Dewsworld'ün çözümü çok daha iyi.
Gerry


3
Bu çok kirli bir çözüm ve bu her şeyi düzeltmeyecek.
Mirko Brunner

1
Cevabınız sorunu çözecek olsa da, "Bu yanlış" satırı kendi başına yanlıştır.
TecBrat

15

2 hata var: ikincisi, $ dom'un bir dizge değil, bir nesne olması ve dolayısıyla "yankılanamaması" nedeniyledir. İlk hata, yüklenecek html belgesinin geçersiz sözdiziminin neden olduğu loadHTML'den gelen bir uyarıdır (muhtemelen parametre ayırıcı olarak kullanılan ve & ile varlık olarak maskelenmemiş bir & (ve işareti)).

Bu hata mesajını (hatayı değil, sadece mesajı!) "@" Hata kontrol operatörü ( http://www.php.net/manual/en/language.operators.errorcontrol ile çağırarak yok sayarsınız ve bastırırsınız . php )

@$dom->loadHTML($html);

12

Önemli hatanızın nedeni DOMDocument'ın __toString () yöntemine sahip olmaması ve dolayısıyla yankılanamamasıdır.

Muhtemelen arıyorsun

echo $dom->saveHTML();

10

Echo ne olursa olsun (print_r veya var_dump ile değiştirilmesi gerekir), bir istisna atılırsa nesne boş kalmalıdır:

DOMNodeList Object
(
)

Çözüm

  1. recoverDoğru ve strictErrorCheckingyanlış olarak ayarlayın

    $content = file_get_contents($url);
    
    $doc = new DOMDocument();
    $doc->recover = true;
    $doc->strictErrorChecking = false;
    $doc->loadHTML($content);
    
  2. En yaygın hata kaynağı olan işaretlemenin içeriğinde php'nin varlık kodlamasını kullanın.


1
İlk çözümde doc yerine dom yazdınız.
Máthé Endre-Botond

bu benim için çalıştı, sadece $ content = mb_convert_encoding ($ içerik, 'HTML-ENTITIES', 'UTF-8') ekledim;
Jacek Pietal

8

basit olanı değiştir

$dom->loadHTML($html);

daha sağlam ...

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

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

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

echo $dom;

bunu dene


3

Bir başka olası çözüm ise

$sContent = htmlspecialchars($sHTML);
$oDom = new DOMDocument();
$oDom->loadHTML($sContent);
echo html_entity_decode($oDom->saveHTML());

Bu işe yaramayacak. Php.net/manual/en/function.htmlspecialchars.php'ye göre , tüm html özel karakterleri de kaçışlıdır . Örneğin bu HTML kodunu ele alalım <span>Hello World</span>. Bunu çalıştırmak artık HTML olmayan htmlspecialcharsüretecektir &lt;span&gt;Hello World&lt/span&gt;. DOMDocument :: loadHTML artık onu HTML olarak değil, bir dizge olarak ele alacak.
Twisted Whisper

Bu benim için çalışıyor:$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
Bartłomiej Jakub Kwiatek

3

Bunun eski bir soru olduğunu biliyorum, ancak HTML'nizdeki hatalı biçimlendirilmiş '&' işaretlerini düzeltmek istemezseniz. Şuna benzer bir kod kullanabilirsiniz:

$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.
        }
    }
}

0

Başka bir olası çözüm de, dosyanız ASCII tipi dosya olabilir, sadece dosyalarınızın türünü değiştirin.


-1

Bundan sonra bile kodum iyi çalışıyor, bu yüzden 1. satırdaki bu ifadeyle tüm uyarı mesajlarını kaldırdım.

<?php error_reporting(E_ERROR); ?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.