sourcetip

DOM 문서::로드HTML 오류

fileupload 2023. 8. 26. 12:09
반응형

DOM 문서::로드HTML 오류

저는 한 페이지에 있는 모든 CSS를 하나로 묶어서 제 cms에 사용하는 스크립트를 만듭니다.오랫동안 잘 작동했는데 이제 다음 오류가 발생합니다.


경고: DOMDocument:: loadHTML() [domdocument.loadhtml]:엔티티, 행: 10(css)에서 태그 헤더가 잘못되었습니다.26줄에 있는 php

경고: DOMDocument:: loadHTML() [domdocument.loadhtml]:엔티티, 행: 10(css)에서 태그 탐색이 잘못되었습니다.26줄에 있는 php

경고: DOMDocument:: loadHTML() [domdocument.loadhtml]:엔티티, 행: 22(css)에서 태그 섹션이 잘못되었습니다.26줄에 있는 php

스크립트 php php입니다.

내 코드는 다음과 같습니다.

<?php
header('Content-type: text/css');
include ('../global.php');

if ($usetpl == '1') {
    $client = New client();
    $tplname = $client->template();
    $location = "../templates/$tplname/header.php";
    $page = file_get_contents($location);
} else {
    $page = file_get_contents('../index.php');
}

class StyleSheets extends DOMDocument implements IteratorAggregate
{

    public function __construct ($source)
    {
        parent::__construct();
        $this->loadHTML($source);
    }

    public function getIterator ()
    {
        static $array;
        if (NULL === $array) {
            $xp = new DOMXPath($this);
            $expression = '//head/link[@rel="stylesheet"]/@href';
            $array = array();
            foreach ($xp->query($expression) as $node)
                $array[] = $node->nodeValue;
        }
        return new ArrayIterator($array);
    }
}

foreach (new StyleSheets($page) as $index => $file) {
    $css = file_get_contents($file);
    echo $css;
}

머리글, Nav 및 Section은 HTML5의 요소입니다. HTML5 개발자들이 공용 및 시스템 식별자를 기억하는 것이 너무 어렵다고 생각했기 때문에 DocType 선언은 다음과 같습니다.

<!DOCTYPE html>

즉, 확인할 DTD가 없으므로 DOM에서 HTML4 Transitional DTD를 사용하도록 하고 이러한 요소를 포함하지 않으므로 Warnings가 표시됩니다.

경고를 누르려면 다음과 같이 입력합니다.

libxml_use_internal_errors(true);

전화하기 loadHTML그리고.

libxml_use_internal_errors(false);

그 후에

대안으로 https://github.com/html5lib/html5lib-php 을 사용할 수 있습니다.

DOMDocument 객체의 경우 모든 경고를 억제하기 위해 로드 방법 앞에 @를 배치할 수 있어야 합니다.

$dom = new DOMDocument;
@$dom->loadHTML($source);

그리고 계속하세요.

지원되지 HTML5 "libxml"로 수 있습니다.$options 명령어

설정하기

$doc = new DOMDocument();
$doc->loadHTMLFile("html5.html", LIBXML_NOERROR);

은 이옵은다선다니호됩다보보다 선호됩니다.@PHP 오류를 잠재웁니다.

그러나 libxml은 매우 관대하며 깨진 HTML 문서를 구문 분석할 수 있습니다.libxml 오류를 침묵시키면 HTML이 잘못된 형식이라는 사실조차 모를 수 있습니다.

대부분의 사람들은 언어로서의 HTML과 XML 그리고 파서와 관련된 HTML과 XML의 차이를 깨닫지 못합니다.파서는 코드를 사용하고 HTML과 XML 파서는 완전히 다릅니다.XML 파서가 브라우저에서 허용하는 몇 가지 사소한 사항(예: 중복)id값) 코드처럼 보이는 정크를 가지고 장난치지 않습니다.

PHP의하며 PHP의 XML 중복을.id 될 수 (를 들어, 로어것예요될소때수있다니문입기가든이떤가치으추가적예▁((▁anything다니:▁element:footer,header,section) PHP의 XML 파서는 알려지지 않은 HTML5+ 요소에 대해 불평하지 않습니다.

$dom->loadXML($xml);

클라이언트 쪽에서 개발 중인 사람이라면 XML 파서를 사용하여 HTML5 코드를 처리하는 것을 강력히 권장합니다. 그리고 2000년대부터 2020년까지 Gecko 브라우저(예: Waterfox, Firefox)를 개발하기 시작한 이래로 전체 페이지가 깨지고 명시적인 오류 메시지가 표시되므로 최고의 XML 파서를 사용할 수 있습니다.더 엄격한 코드는 품질을 이해할 수 있으면 더 나은 결과를 산출하지만 그 반대는 사실이 아닙니다.

DOMDocument를 사용하는 대신 Symfony의 다음 편리한 DomCollower 구성 요소를 사용할 수 있습니다.

https://symfony.com/doc/current/components/dom_crawler.html

composer require symfony/dom-crawler

그러면 멋진 일을 할 수 있습니다.

$crawler = new Crawler($html);
$crawler->filter(".whatever .wild > .query  ~.you[name=it]")->each(function($node, $i){
    print_r($node->text());

    //or something like this
    $node->children()->each(function($node_inner, $j){
        ...
    });
    ...
});

언급URL : https://stackoverflow.com/questions/9149180/domdocumentloadhtml-error

반응형