2011-11-15 115 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 />"; 
} 

基本上我需要的是尋找一個element的DOM與特定id,在此之後我需要提取非 - 標準的attribute(也就是我用JS編寫和使用的),所以我可以看到它的價值。原因是我需要從$_GET中獲得一張,並且從重定向中獲取基於HTML的一張。如果有人可以解釋我如何使用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。這些都應該是唯一的,所以要做到這一點,你可以使用(注意:getElementById可能無法正常工作,除非你叫$dom->validate()在前):

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

然後讓你的屬性:

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

編輯$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

是的,我使用DOM庫以這種方式編寫HTML。但我試圖對組成的HTML進行測試。getElementById()總是返回null,即使它在呈現的HTML中很清楚。 –

1

如果重定向來自外部服務器,則無法訪問HTML。讓我這樣說:在你試圖解析它的時候,DOM不存在。你可以做的是將文本傳遞給DOM解析器,然後通過這種方式操作元素。或者更好的方法是將它添加爲另一個GET變量。

編輯:你是否也知道客戶端可以更改HTML並讓它通過他們想要的任何東西? (使用像Firebug這樣的工具)