PHP Dom eleman almak değil

4 Cevap php
$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'));

var_dump her zaman döner NULL. Herkes neden biliyor musun? Ben açıkça kimliği galeria_list içinde olan elemanı görebilirsiniz $code. Neden bu eleman almıyor?

Ve aynı zamanda, herkes <html> ve saveHTML yöntemi <body> etiketleri ekleme gelen DOMDocument önlemek için nasıl biliyor?

Teşekkürler

4 Cevap

Bu DOMDocument HTML parçaları ile oynamak güzel olmayacak gibi görünüyor. Sen DOMDocumentFragment (dnagirl suggests gibi) düşünün veya DOMDocument uzanan düşünün ya isteyebilirsiniz.

Ufak bir araştırmadan sonra, ben birlikte ne soran elde edecek basit bir uzantısı koyduk:

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);

    }

}

Usage

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

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

echo $dom->output();

Öyle görünüyor ki loadHTML () id DOM bir id-nitelik olarak tanımlayan html DTD "eklemek" değil. Html belge DOCTYPE bildirimi içeriyorsa istendiği gibi ama çalışıyor. (Ama benim tahminim yine, bir doctype ve html iskeleti eklemek istemiyorum :).

$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'));

Eğer başlıklarını istemiyorsanız yerine DOMDocument daha DOMDocumentFragment düşünebilirsiniz.

Id sorun için olduğu gibi, bu manual alınmıştır:

<?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 olasılıkla konudur.

http://us3.php.net/manual/en/domdocument.getelementbyid.php#96500: Birisi, XPath kullanarak PHP kılavuzunda bu sorunu çalıştı