2011-11-15 9 views
8

PHPでDOMElementオブジェクトを使用する方法を理解するのに苦労しています。私はこのコードを見つけましたが、私はそれが私に適用だ本当によく分からない:PHPを使用してDOM要素を取得する

$dom = new DOMDocument(); 
$dom->loadHTML("index.php"); 

$div = $dom->getElementsByTagName('div'); 
foreach ($div->attributes as $attr) { 
    $name = $attr->nodeName; 
    $value = $attr->nodeValue; 
    echo "Attribute '$name' :: '$value'<br />"; 
} 

基本的に私は必要なもの、私が非を抽出する必要がどの時点の後、特定のidelementのためのDOMを検索することです-standard attribute(つまり、私がJSで作成して入れたもの)だから、その価値を知ることができます。なぜなら、私は$_GETから1ピース、リダイレクトからHTMLにある1ピースが必要だからです。もし誰かがこの目的のためにDOMDocumentをどのように使うのか説明できたら助かります。私は本当に正しいことをしていないので、何が起こっているのか、それを正しく実装する方法を理解するのに本当に苦労しています。

EDIT(私はコメントをもとにしています):

これは私のコード行の参照のための4-26です:

<div id="column_profile"> 
    <?php 
     require_once($_SERVER["DOCUMENT_ROOT"] . "/peripheral/profile.php");    
     $searchResults = isset($_GET["s"]) ? performSearch($_GET["s"]) : ""; 

     $dom = new DOMDocument(); 
     $dom->load("index.php"); 

     $divs = $dom->getElementsByTagName('div'); 
     foreach ($divs as $div) { 
      foreach ($div->attributes as $attr) { 
       $name = $attr->nodeName; 
       $value = $attr->nodeValue; 
       echo "Attribute '$name' :: '$value'<br />"; 
      } 
     } 
     $div = $dom->getElementById('currentLocation'); 
     $attr = $div->getAttribute('srckey'); 
     echo "<h1>{$attr}</a>"; 
    ?> 
</div> 

<div id="column_main"> 

ここで私が得ているエラーメッセージです:

Warning: DOMDocument::load() [domdocument.load]: Extra content at the end of the document in ../public_html/index.php, line: 26 in ../public_html/index.php on line 10 

Fatal error: Call to a member function getAttribute() on a non-object in ../public_html/index.php on line 21 
+0

'index.hp'は実行されません。 'loadHTML'はファイルの内容を読み込み、それを実行しません。あなたは '$ dom-> loadHTML(file_get_contents( 'http://localhost/index.php'))'のようなことをする必要があります。 –

答えて

14

getElementsByTagName戻ります要素のリストを、その最初のあなたは、その属性によって、要素をループする必要があります。

$divs = $dom->getElementsByTagName('div'); 
foreach ($divs as $div) { 
    foreach ($div->attributes as $attr) { 
     $name = $attr->nodeName; 
     $value = $attr->nodeValue; 
     echo "Attribute '$name' :: '$value'<br />"; 
    } 
} 

あなたの場合、特定のIDが必要だと言いました。

$attr = $div->getAttribute('customAttr'); 

EDIT:あなたの属性を取得するためにその後

$div = $dom->getElementById('divID'); 

:それらはそう、あなたが使用することができます(あなたが最初$dom->validate()を呼び出さない限りgetElementByIdが動作しない場合があります注意してください)ことを行うには、ユニークなことになっています$dom->loadHTMLはファイルの内容を読み取るだけで、ファイルは実行されません。 index.phpはこの方法では実行されません。

$dom->loadHTML(file_get_contents('http://localhost/index.php')) 
+1

HTMLにdoctype宣言が含まれていない場合、これは機能しますか? [DOMDocument :: getElementById](http://us3.php.net/manual/en/domdocument.getelementbyid.php)のドキュメントページには、HTMLにdoctype宣言が含まれていないと示唆されています。 'getElementById()'は常に 'null'を返します。 –

+0

そのコメントが何を言っているのか分かりません。 'DOMDocument'は' 'がなくてもHTML上でうまく動作します。デモ:https://3v4l.org/0mGrg –

+0

はい、私はそのようにHTMLを構成するためにDOMライブラリを使用しています。しかし、私は構成されたHTMLに対してテストを実行しようとしています。'getElementById()'は、レンダリングされたHTMLにはっきりとしていても常に 'null'を返します。 –

1

リダイレクトが外部サーバーからのものである場合、HTMLにアクセスすることはできません。私はそれをこのように置いておきます:あなたがそれを解析しようとしているところにDOMは存在しません。あなたができることは、テキストをDOMパーサに渡し、そのように要素を操作することです。または、より良い方法は、別のGET変数として追加することです。

EDIT:クライアントはHTMLを変更して、必要なものを渡すことができることに気づいていますか? (Firebugのようなツールを使って)

関連する問題