2010-03-19 4 views
2
$code = ' 
<h1>Galeria </h1> 

<div class="galeria"> 
    <ul id="galeria_list"> 
     <li> 
      <img src="img.jpg" width="350" height="350" /> 
      <br /> 
      Teste 
     </li> 
    </ul> 
</div>'; 


$dom = new DOMDocument; 
$dom->validateOnParse = true; 

$dom->loadHTML($code); 

var_dump($dom->getElementById('galeria_list')); 

Le var_dump renvoie toujours NULL. Quelqu'un sait pourquoi? Je peux voir clairement l'élément avec l'ID galeria_list dans $code. Pourquoi cela n'obtient-il pas l'élément?PHP Dom ne récupérant pas l'élément

Et aussi, quelqu'un sait-il comment empêcher le domdocument d'ajouter les balises <html> et <body> sur la méthode saveHTML?

Merci

Répondre

1

Il semble que le DOMDocument ne jouera pas agréable avec des fragments HTML. Vous pouvez soit considérer le DOMDocumentFragment (comme dnagirl suggests) ou envisager d'étendre le DOMDocument.

Après un peu de recherche, je l'ai mis en place une simple extension qui permettra d'atteindre ce que vous demandez:

class MyDOMDocument extends DOMDocument { 

    function getElementById($id) { 

     //thanks to: http://www.php.net/manual/en/domdocument.getelementbyid.php#96500 
     $xpath = new DOMXPath($this); 
     return $xpath->query("//*[@id='$id']")->item(0); 
    } 

    function output() { 

     // thanks to: http://www.php.net/manual/en/domdocument.savehtml.php#85165 
     $output = preg_replace('/^<!DOCTYPE.+?>/', '', 
       str_replace(array('<html>', '</html>', '<body>', '</body>'), 
         array('', '', '', ''), $this->saveHTML())); 

     return trim($output); 

    } 

} 

Utilisation

$dom = new MyDOMDocument(); 
$dom->loadHTML($code); 

var_dump($dom->getElementById("galeria_list")); 

echo $dom->output(); 
+0

Merci pour le code :) – AntonioCS

1

Vous pourriez envisager DOMDocumentFragment plutôt que DOMDocument si vous ne voulez pas les en-têtes.

En ce qui concerne le problème d'identité, cela est de la manual:

<?php 

$doc = new DomDocument; 

// We need to validate our document before refering to the id 
$doc->validateOnParse = true; 
$doc->Load('book.xml'); 

echo "The element whose id is books is: " . $doc->getElementById('books')->tagName . "\n"; 

?> 

validateOnParse est probablement la question.

+0

Je vais examiner cela. Savez-vous pourquoi je ne reçois pas l'élément? – AntonioCS

4

Il semble que loadHTML() ne pas « attacher "le html dtd qui définit id en tant qu'id-attribut au DOM. Mais si le document html contient une déclaration DOCTYPE cela fonctionne comme prévu. (Mais je suppose que vous ne voulez pas ajouter un doctype et un squelette html, de toute façon :).

$code = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html><head><title>...</title></head> 
<body> 
    <h1>Galeria </h1> 
    <div class="galeria"> 
    <ul id="galeria_list"> 
     <li> 
     <img src="img.jpg" width="350" height="350" /> 
     <br /> 
     Teste 
     </li> 
    </ul> 
    </div> 
</body></html>'; 

$dom = new DOMDocument; 
$dom->loadhtml($code); 
var_dump($dom->getElementById('galeria_list')); 
Questions connexes