$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
始终返回NULL
。谁知道为什么?我可以清楚地看到galeria_list
中标识为$code
的元素。为什么这不是元素?
此外,是否有人知道如何防止domdocument在<html>
方法上添加<body>
和saveHTML
标记?
由于
答案 0 :(得分:4)
似乎loadhtml()不会将定义id
的html dtd“附加”为DOM的id属性。但是如果html文档包含DOCTYPE声明,它就会按预期工作。 (但我的猜测是你不想添加doctype和html骨架,无论如何:)。
$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'));
答案 1 :(得分:1)
如果您不想要标题,可以考虑使用DOMDocumentFragment而不是DOMDocument。
至于id问题,这来自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
可能就是问题。
答案 2 :(得分:1)
似乎DOMDocument
对HTML片段不起作用。您可能需要考虑DOMDocumentFragment
(作为dnagirl suggests)或考虑扩展DOMDocument
。
经过一番研究后,我总结了一个简单的扩展,可以实现您的要求:
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);
}
}
$dom = new MyDOMDocument();
$dom->loadHTML($code);
var_dump($dom->getElementById("galeria_list"));
echo $dom->output();
答案 3 :(得分:0)
有人使用XPath解决了PHP手册中的这个问题:http://us3.php.net/manual/en/domdocument.getelementbyid.php#96500