web-dev-qa-db-fra.com

Utiliser PHP pour obtenir l'élément DOM

J'ai du mal à comprendre comment utiliser l'objet DOMElement en PHP. J'ai trouvé ce code, mais je ne suis pas vraiment sûr qu'il s'applique à moi:

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

Fondamentalement, ce dont j'ai besoin est de rechercher dans le DOM un element avec un id particulier, après quoi je dois extraire un attribute non standard (c'est-à-dire un que j'ai fait et mettre en place avec JS) afin que je puisse voir la valeur de cela. La raison en est que j'ai besoin d'une pièce du $_GET et un morceau qui est dans le HTML basé sur une redirection. Si quelqu'un pouvait simplement expliquer comment j'utilise DOMDocument à cette fin, ce serait utile. J'ai vraiment du mal à comprendre ce qui se passe et comment l'appliquer correctement, car je ne le fais clairement pas correctement.

EDIT (Où je suis basé sur un commentaire):

Voici mes lignes de code 4-26 pour référence:

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

Voici le message d'erreur que je reçois:

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 vous renvoie une liste d'éléments, vous devez donc d'abord parcourir les éléments, puis leurs attributs.

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

Dans votre cas, vous avez dit que vous aviez besoin d'un identifiant spécifique. Ceux-ci sont censés être uniques, donc pour ce faire, vous pouvez utiliser (note getElementById peut ne pas fonctionner sauf si vous appelez $dom->validate() d'abord):

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

Ensuite pour obtenir votre attribut:

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

[~ # ~] modifier [~ # ~] : $dom->loadHTML lit simplement le contenu du fichier, il ne les exécute pas . index.php Ne sera pas exécuté de cette façon. Vous devrez peut-être faire quelque chose comme:

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

Vous n'aurez pas accès au HTML si la redirection provient d'un serveur externe. Permettez-moi de le dire ainsi: le DOM n'existe pas au moment où vous essayez de l'analyser. Ce que vous pouvez faire est de passer le texte à un analyseur DOM, puis de manipuler les éléments de cette façon. Ou la meilleure façon serait de l'ajouter comme autre variable GET.

EDIT: Savez-vous également que le client peut changer le HTML et le faire passer ce qu'il veut? (Utilisation d'un outil comme Firebug)

2
jakx