web-dev-qa-db-ja.com

PHPを使用してDOM要素を取得する

PHPでDOMElementオブジェクトを使用する方法を理解するのに非常に時間がかかっています。私はこのコードを見つけましたが、それが私に当てはまるか本当にわかりません:

$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 />";
}

基本的に必要なのは、DOMで特定のelementを使用してidを検索することです。その後、非標準のattribute(つまり、作成したもの)を抽出する必要がありますJSを使用して、その価値を確認できます。その理由は、$_GETと、リダイレクトに基づくHTMLに含まれる1つの要素。誰かがこの目的でDOMDocumentをどのように使用するかを説明できれば、それは役に立ちます。私は明らかに正しく行っていないため、何が起こっているのか、それを適切に実装する方法を理解するのに本当に苦労しています。

編集(コメントに基づく場所):

これは参考のために私のコード行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
16
Matt

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が必要だと言いました。これらは一意であることが想定されているため、これを行うには次のように使用できます(注 getElementById は、最初に$dom->validate()を呼び出さない限り機能しない可能性があります)。

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

次に、属性を取得します。

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

[〜#〜] edit [〜#〜]:_$dom->loadHTML_はファイルの内容を読み取るだけで、実行しません。 _index.php_はこの方法で実行されません。あなたは次のようなことをしなければならないかもしれません:

_$dom->loadHTML(file_get_contents('http://localhost/index.php'))
_
20
Rocket Hazmat

リダイレクトが外部サーバーからの場合は、HTMLにアクセスできません。言い換えると、DOMは解析しようとしている時点では存在しません。できることは、テキストをDOMパーサーに渡し、要素をそのように操作することです。または、別のGET変数として追加することをお勧めします。

編集:クライアントがHTMLを変更して、必要なものをすべて渡せることも知っていますか? (Firebugなどのツールを使用)

2
jakx