2011-05-22 78 views
84

HTML5コードを解析してコード内に属性/値を設定しようとしましたが、DOMDocument(PHP5.3)は<nav>のようなタグをサポートしていないようです<section>html5タグのPHP DOMDocumentエラー/警告

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

エラー

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

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

+0

オプスを行い' FALSE(失敗)を返します!私はDIVに新しいタグを変更する必要があります...それは私の画面上の "警告"の問題だけではありません。 –

+1

この問題はPHPのhttps://bugs.php.net/bugで報告されています。php?id = 60021これは、基礎となるlibxml2で機能リクエストを生成しました:https://bugzilla.gnome.org/show_bug.cgi?id=761534 – cweiske

答えて

136

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

あなたの最高の可能な解決策はlibxml_use_internal_errorsでエラー報告を無効にすることになるだろう:

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

Ops、私にとっては、 'loadHTML($ HTML5)'はFALSEを返します(失敗)!私はDIVに新しいタグを変更する必要があります... –

+0

素晴らしい、非常に答えと@クラマスに感謝あなたの質問に感謝します。 – whitesiroi

+5

__ * php7 * __の組み込みDOMパーサー_still_はHTML5を処理できません。この回答が提出されてから6年経ちました。 –

7

また、あなたはあなたがパーサから取得エラーをフィルタリングすることができ

@$dom->loadHTML($htmlString); 
+11

エラー抑制はこの問題を処理する適切な方法ではありません。 –

+4

@KlaasSangers私たちがDOMの実装を損なうまでは、(@またはlibxml_ *のいずれかを介して) – Dan

+5

ええ、この特定のケースでは、エラー抑制が最良の解決策であると私は思っています。あなたが読み込んでいるHTMLがPHPの定義に従って100%有効なHTMLであるとわかっている場合を除きます。私の経験では決してそうではありません。 – hanshenrik

5

を行うことができます。ここでは他の回答ごとに、画面にエラー報告をオフにして、エラーを反復処理し、唯一のあなたが欲しいものを示しています。ここ

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で一致させることで、これらは非常に簡単に除外できます。

1

これが私の仕事:

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

それは最善の解決策ではないですが、状況に応じて、それが役立つことがあります。

幸運。

-3

HTML5タグは、ほとんどの場合、id、クラスなどの属性を使用します。交換コードは

$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

です。警告を殺す方法はありませんが、エラーはありません。 PHPにはこれを行う定数がありますが、動作しないようです。ここで動作するはずであるものですが、私 `loadHTML($ HTML5)のために、ではないので(バグ?)....

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

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

+0

これは修正されたバグです:https://bugs.php.net/bug.php?id=74004 –

+0

この投稿によるとhttps://stackoverflow.com/a/41845049/937477そのバグが修正されました –