[php] 경고 : DOMDocument :: loadHTML () : htmlParseEntityRef : ‘;’예상 엔티티에서

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

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

echo $dom;

던지다

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



답변

경고를 증발 시키려면 다음을 사용할 수 있습니다. 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);


답변

소스를 살펴보면 http://www.somesite.com/HTML로 변환되지 않은 특수 문자를 찾을 수있을 것입니다. 아마도 다음과 같습니다.

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

해야한다

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


답변

$dom->@loadHTML($html);

이것은 올바르지 않습니다. 대신 다음을 사용하십시오.

@$dom->loadHTML($html);


답변

두 가지 오류가 있습니다. 두 번째는 $ dom이 문자열이 아니라 객체이므로 “반향”될 수 없기 때문입니다. 첫 번째 오류는로드 할 html 문서의 잘못된 구문으로 인해 발생하는 loadHTML의 경고입니다 (아마도 & (앰퍼샌드)가 매개 변수 구분 기호로 사용되고 &로 엔티티로 마스킹되지 않음).

오류 제어 연산자 “@”( http://www.php.net/manual/en/language.operators.errorcontrol. PHP )

@$dom->loadHTML($html);


답변

치명적인 오류의 이유는 DOMDocument 에 __toString () 메서드가 없으므로 에코 될 수 없기 때문입니다.

당신은 아마 찾고 있습니다

echo $dom->saveHTML();


답변

에코 (print_r 또는 var_dump로 대체해야 함)에 관계없이 예외가 발생하면 객체는 비어 있어야합니다.

DOMNodeList Object
(
)

해결책

  1. 설정 recovertrue로하고, strictErrorCheckingfalse로

    $content = file_get_contents($url);
    
    $doc = new DOMDocument();
    $doc->recover = true;
    $doc->strictErrorChecking = false;
    $doc->loadHTML($content);
    
  2. 가장 일반적인 오류 소스 인 마크 업의 내용에 PHP의 엔티티 인코딩을 사용합니다.


답변

단순한 것을 대체하십시오

$dom->loadHTML($html);

더 강력한 …

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