コード内で属性/値を設定できるように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行目
いいえ、使用する特定のDoctypeを指定したり、既存の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にはこれを行うはずの定数がありますが、動作していないようです。以下は動作するはずですが、動作しません(バグ?)....
$doc=new DOMDocument();
$doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING );
echo $doc->saveHTML();
これは私のために働いた:
$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>");
これは最善の解決策ではありませんが、状況によっては役立つ場合があります。
幸運を。