PHP DOMDocument errors / warnings on html5-tags

Próbowałem przeanalizować kod HTML5, aby móc ustawić atrybuty / wartości w kodzie, ale wydaje się, że DOMDocument (PHP5. 3) nie obsługuje znaczników takich jak <nav> i <section>.

Czy Jest jakiś sposób na przetworzenie tego jako HTML w PHP i manipulowanie kodem?


Kod do odtworzenia:

<?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>");

Błąd

Warning: DOMDocument:: loadHTML (): Tag nav invalid in Entity, line: 4 in / home/wbkrnl/public_html / new-mvc / 1.php on line 17

Ostrzeżenie: DOMDocument:: loadHTML (): Tag sekcja nieprawidłowa w encji, linia: 10 w / home/wbkrnl/public_html / new-mvc / 1.php on line 17

Author: Klaas Sangers, 2011-05-23

6 answers

Nie, nie ma możliwości określenia konkretnego doctype do użycia, ani modyfikacji wymagań istniejącego.

Twoim najlepszym rozwiązaniem będzie wyłączenie raportowania błędów za pomocą libxml_use_internal_errors:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML('...');
libxml_clear_errors();
 152
Author: lonesomeday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 07:35:13

Możesz filtrować błędy otrzymane z parsera. Jak na inne odpowiedzi tutaj, wyłącz raportowanie błędów na ekranie, a następnie powtarzaj błędy i Pokaż tylko te, które chcesz: {]}

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

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

Oto print_r() pojedynczego błędu:

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

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

Poprzez dopasowanie na message i / lub code, można je dość łatwo odfiltrować.

 6
Author: halfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 10:47:11

Możesz też zrobić

@$dom->loadHTML($htmlString);
 6
Author: Ilker Mutlu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-11 09:23:09

To mi pomogło:

$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);

Jeśli potrzebujesz znacznika nagłówka, Zmień nagłówek za pomocą znacznika div I użyj identyfikatora. Na przykład:

$search = array("<header>", "</header>");
$replace = array("<div id='header1'>", "</div>");
Nie jest to najlepsze rozwiązanie, ale w zależności od sytuacji może być przydatne. Powodzenia.
 1
Author: Emiliano Sangoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-07 00:40:28

Wygląda na to, że nie ma sposobu na zabijanie ostrzeżeń, ale nie na błędy. PHP ma stałe, które powinny to robić, ale nie wydają się działać. Oto, co powinno działać, ale nie ponieważ (bug?)....

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

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

 0
Author: user2782001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 19:12:07

Znaczniki HTML5 prawie zawsze używają atrybutów takich jak id, class i tak dalej. Więc kod do zastąpienia będzie:

$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);
 -4
Author: Sergey Kaluzhsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 09:06:12