提取html代码的部分


Extracting parts of an html code

假设我有以下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代码。我希望能够返回两个东西:

  1. 类为block的div块
  2. 不包含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 innerHTML
echo DOMinnerHTML($doc->getElementsByTagName('body')->item(0));