PHP DOMDocument ошибки / предупреждения по html5-тегам - PullRequest
96 голосов
/ 23 мая 2011

Я пытался разобрать HTML5-код, чтобы я мог установить атрибуты / значения в коде, но кажется, что DOMDocument (PHP5.3) не поддерживает теги, такие как <nav> и <section>.

Есть ли способ проанализировать это как HTML в PHP и манипулировать кодом?


Код для воспроизведения:

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

Error

Предупреждение: DOMDocument :: loadHTML (): Tag nav недействителен в Entity, строка: 4 в /home/wbkrnl/public_html/new-mvc/1.php по линии 17

Предупреждение: DOMDocument :: loadHTML (): Tag раздел недействителен в сущности, строка: 10 в /home/wbkrnl/public_html/new-mvc/1.php по линии 17

Ответы [ 6 ]

167 голосов
/ 23 мая 2011

Нет, невозможно указать конкретный тип документа или изменить требования к существующему.

Ваше лучшее работоспособное решение - отключить отчеты об ошибках с помощью libxml_use_internal_errors:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML('...');
libxml_clear_errors();
7 голосов
/ 04 сентября 2014

Вы также можете сделать

@$dom->loadHTML($htmlString);
6 голосов
/ 02 декабря 2015

Вы можете отфильтровать ошибки, которые вы получаете от анализатора.Как и в случае с другими ответами, отключите создание отчетов об ошибках на экране, а затем переберите ошибки и покажите только те, которые вам нужны:

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 их можно довольно легко отфильтровать.

0 голосов
/ 25 января 2017

Кажется, нет способа убить предупреждения, но нет ошибок.В PHP есть константы, которые должны это делать, но они, похоже, не работают.Вот то, что ДОЛЖНО работать, но не потому (ошибка?) ....

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

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

0 голосов
/ 18 октября 2016

Теги HTML5 почти всегда используют такие атрибуты, как идентификатор, класс и т. Д. Так что код для замены будет:

$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);
0 голосов
/ 07 июля 2016

Это сработало для меня:

$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 и используйте идентификатор. Например:

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

Это не лучшее решение, но в зависимости от ситуации оно может быть полезным.

Удачи.

...