假设我有以下HTML代码:
<p>Test text</p>
<p><img src="test.jpg" /></p>
<div id="test"><p>test</p></div>
<div class="block">
<img src="test2.jpg">
</div>
<p>test</p>
参数:
- 将存在一个div块,类为"block"
- 可以有任何数量的HTML代码上面或下面的div块类"block"
- 甚至可以有两个div块,类为"block"
我使用PHP的XPath来查看使用DOM的HTML代码。我希望能够返回两个东西:
- 类为block的div块
- 不包含div元素和block类的其余代码
类似:
块代码:
<div class="block">
<img src="test2.jpg">
</div>
原始无块码:
<p>Test text</p>
<p><img src="test.jpg" /></p>
<div id="test"><p>test</p></div>
<p>test</p>
通过使用DOMDocument
,您可以这样做:
$content = '<p>Test text</p>'.
'<p><img src="test.jpg" /></p>'.
'<div id="test"><p>test</p></div>'.
'<div class="block">'.
'<img src="test2.jpg">'.
'</div>'.
'<p>test</p>';
$blocks = array();
$doc = new DOMDocument();
$doc->loadHTML($content);
$elements = $doc->getElementsByTagName("*");
foreach ($elements as $element) {
if($element->hasAttributes()) {
if ($element->getAttribute('class') == 'block') {
//add block HTML to block array
$blocks[]=$doc->saveHTML($element);
//remove blocck element
$element->parentNode->removeChild($element);
}
}
}
echo '<pre>';
echo $blocks[0]; //iterate or print_r if multiple blocks
echo $doc->saveHTML();
echo '</pre>';
输出"块码":
<div class="block"><img src="test2.jpg"></div>
和"original without block code":
<p>Test text</p><p><img src="test.jpg"></p><div id="test"><p>test</p></div><p>test</p>
如果你不能接受DOMDocument用doctype、HTML和body来"丰富"HTML,当你想要完整的文档,而不仅仅是一些摘录时,这是非常烦人的,你可以使用这个简洁的函数并使用:
提取body innerHTMLecho DOMinnerHTML($doc->getElementsByTagName('body')->item(0));