[php] HTML5 태그의 PHP DOMDocument 오류 / 경고

나는 코드 내에서 속성 / 값을 설정할 수 있도록 내가 구문 분석 HTML5 코드를 시도했습니다,하지만있는 DOMDocument (PHP5.3가)와 같은 태그를 지원하지 않는 것 같습니다 <nav><section>.

이것을 PHP에서 HTML로 구문 분석하고 코드를 조작하는 방법이 있습니까?


재현 할 코드 :

<?php
$dom = new DOMDocument();
$dom->loadHTML("<!DOCTYPE HTML>
<html><head><title>test</title></head>
<body>
<nav>
  <ul>
    <li>first
    <li>second
  </ul>
</nav>
<section>
  ...
</section>
</body>
</html>");

오류

경고 : DOMDocument :: loadHTML () : 엔티티에서 잘못된 태그 탐색, 줄 : 17 줄의 /home/wbkrnl/public_html/new-mvc/1.php의 4

경고 : DOMDocument :: loadHTML () : 엔티티에서 잘못된 태그 섹션, 줄 : 17 줄의 /home/wbkrnl/public_html/new-mvc/1.php의 10



답변

아니요, 사용할 특정 doctype을 지정하거나 기존 문서 유형의 요구 사항을 수정할 방법이 없습니다.

가장 효과적인 해결책은 다음을 사용하여 오류보고를 비활성화하는 것입니다 libxml_use_internal_errors.

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML('...');
libxml_clear_errors();


답변

당신은 또한 할 수 있습니다

@$dom->loadHTML($htmlString);


답변

파서에서 얻은 오류를 필터링 할 수 있습니다. 여기의 다른 답변에 따라 화면에 대한 오류보고를 끄고 오류를 반복하고 원하는 오류 만 표시합니다.

libxml_use_internal_errors(TRUE);
// Do your load here
$errors = libxml_get_errors();

foreach ($errors as $error)
{
    /* @var $error LibXMLError */
}

다음은 print_r()단일 오류입니다.

LibXMLError Object
(
    [level] => 2
    [code] => 801
    [column] => 17
    [message] => Tag section invalid

    [file] =>
    [line] => 39
)

message및 / 또는 을 일치 시키면 code이러한 항목을 매우 쉽게 필터링 할 수 있습니다.


답변

경고를 죽이는 방법은 없지만 오류는없는 것 같습니다. PHP에는이를 수행해야하는 상수가 있지만 작동하지 않는 것 같습니다. 다음은 SHOULD가 작동하지만 (버그?) …

 $doc=new DOMDocument();
 $doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING );
 echo $doc->saveHTML();

http://php.net/manual/en/libxml.constants.php


답변

이것은 나를 위해 일했습니다.

$html = file_get_contents($url);

$search = array("<header>", "</header>", "<nav>", "</nav>", "<section>", "</section>");
$replace = array("<div>", "</div>","<div>", "</div>", "<div>", "</div>");
$html = str_replace($search, $replace, $html);

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

헤더 태그가 필요한 경우 div 태그로 헤더를 변경하고 ID를 사용하십시오. 예를 들면 :

$search = array("<header>", "</header>");
$replace = array("<div id='header1'>", "</div>");

최선의 해결책은 아니지만 상황에 따라 유용 할 수 있습니다.

행운을 빕니다.


답변

HTML5 태그는 거의 항상 id, class 등과 같은 속성을 사용합니다. 따라서 교체 코드는 다음과 같습니다.

$html = file_get_contents($url);
$search = array(
    "<header", "</header>",
    "<nav", "</nav>",
    "<section", "</section>",
    "<article", "</article>",
    "<footer", "</footer>",
    "<aside", "</aside>",
    "<noindex", "</noindex>",
);
$replace = array(
    "<div", "</div>",
    "<div", "</div>",
    "<div", "</div>",
    "<div", "</div>",
    "<div", "</div>",
    "<div", "</div>",
    "<div", "</div>",
);
$html = str_replace($search, $replace, $html);
$dom = new DOMDocument();
$dom->loadHTML($html);


답변