2011-11-15 20 views
8

Długo staram się zrozumieć, jak używać obiektu DOMElement w PHP. Znalazłem ten kod, ale nie jestem pewien, że to dotyczy mnie:Używanie PHP do uzyskania elementu 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 />"; 
} 

zasadzie to, co potrzebne jest, aby szukać DOM dla element ze szczególnym id, po którym punkt muszę wyodrębnić non -standardowy attribute (tj. taki, który wymyśliłem i nałożyłem na JS), więc widzę wartość tego. Powód jest taki, że potrzebuję jednego kawałka z $_GET i jednego kawałka, który jest w kodzie HTML opartym na przekierowaniu. Jeśli ktoś mógłby po prostu wyjaśnić, w jaki sposób używam DOMDocument do tego celu, byłoby to pomocne. Naprawdę walczę o zrozumienie tego, co się dzieje i jak właściwie to zaimplementować, ponieważ wyraźnie nie robię tego dobrze.

EDIT (Gdzie jestem na podstawie komentarzu):

To jest moje linii kodu 4-26 dla odniesienia:

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

Oto komunikat dostaję:

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' nie zostanie wykonane. 'loadHTML' odczytuje zawartość pliku, nie uruchamia go. Może zajść potrzeba zrobienia czegoś takiego: '$ dom-> loadHTML (file_get_contents ('http: //localhost/index.php'))'. –

Odpowiedz

14

getElementsByTagName powrót listę elementów, więc najpierw trzeba pętli elementów, a następnie poprzez ich atrybutów.

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

W twoim przypadku powiedziałeś, że potrzebujesz konkretnego identyfikatora. Ci mają być wyjątkowy, tak aby to zrobić, można użyć (uwaga getElementById może nie działać, jeśli zadzwonisz $dom->validate() pierwszy):

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

Następnie, aby uzyskać atrybut:

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

EDIT: $dom->loadHTML po prostu odczytuje zawartość pliku, nie wykonuje ich. index.php nie będzie działać w ten sposób. Może być konieczne wykonanie następujących czynności:

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

Czy to działa, jeśli twój HTML nie zawiera deklaracji typu dokumentu? Komentarz na stronie dokumentacji [DOMDocument :: getElementById] (http://us3.php.net/manual/en/domdocument.getelementbyid.php) sugeruje, że jeśli kod HTML nie zawiera deklaracji typu dokumentu. 'getElementById()' zawsze zwraca 'null'. –

+0

Nie jestem pewien, co ten komentarz próbuje powiedzieć. "DOMDocument" działa dobrze na HTML bez ''. Demo: https://3v4l.org/0mGrg –

+0

Tak, używam biblioteki DOM do komponowania HTML w ten sposób. Ale próbuję uruchomić testy względem skompilowanego HTML.'getElementById()' zawsze zwraca 'null' nawet wtedy, gdy jest wyraźnie w renderowanym kodzie HTML. –

1

Nie będziesz mieć dostępu do HTML, jeśli przekierowanie pochodzi z zewnętrznego serwera. Powiem tak: DOM nie istnieje w miejscu, w którym próbujesz go przetworzyć. Możesz przekazać tekst do parsera DOM, a następnie manipulować elementami w ten sposób. Lub lepszym sposobem byłoby dodanie go jako innej zmiennej GET.

EDYCJA: Czy zdajesz sobie sprawę, że klient może zmienić kod HTML i przekazać to, co chce? (Za pomocą narzędzia takiego jak Firebug)

Powiązane problemy