web-dev-qa-db-ja.com

PHP html5-tagsの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():エンティティのタグnavが無効です、行:4 /home/wbkrnl/public_html/new-mvc/1.phpの17行目

警告:DOMDocument :: loadHTML():エンティティのタグセクションが無効です、行:10 /home/wbkrnl/public_html/new-mvc/1.phpの17行目

99
Klaas Sangers

いいえ、使用する特定のDoctypeを指定したり、既存のDoctypeの要件を変更したりする方法はありません。

最も有効な解決策は、 libxml_use_internal_errors

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

あなたもできる

@$dom->loadHTML($htmlString);
9
Ilker Mutlu

パーサーから取得したエラーをフィルタリングできます。ここでの他の回答に従って、画面へのエラー報告をオフにしてから、エラーを反復処理し、必要なもののみを表示します:

_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を照合することにより、これらを非常に簡単に除外できます。

6
halfer

警告ではなくエラーを強制終了する方法はないようです。 PHPにはこれを行うはずの定数がありますが、動作していないようです。以下は動作するはずですが、動作しません(バグ?)....

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

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

1
user2782001

これは私のために働いた:

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

これは最善の解決策ではありませんが、状況によっては役立つ場合があります。

幸運を。

0
Emiliano Sangoi