提取html代码的部分内容

时间:2014-03-18 15:48:33

标签: php html parsing xpath

假设我有以下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>

参数:

  • 将存在一个带有“block”类的div块
  • div块上方或下方的任何数量的HTML代码都可以使用“block”类
  • 甚至可能有两个带有“block”类的div块

我使用PHP的XPath来使用DOM查看此HTML代码。我希望能够归还两件事:

  1. 带有“block”类的div块
  2. 所有其余代码没有div元素,其中包含“block”类
  3. 类似的东西:

    区块代码:

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

1 个答案:

答案 0 :(得分:1)

使用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>';

输出&#34;块代码&#34; :

<div class="block"><img src="test2.jpg"></div>

和#34;原版没有块代码&#34; :

<p>Test text</p><p><img src="test.jpg"></p><div id="test"><p>test</p></div><p>test</p>

如果你只是不能接受DOMDocument&#34;丰富&#34;带有doctype,html和body的HTML,如果你想要完整的文档,而不仅仅是一些提取,你可以use this neat function并使用以下内容提取body innerHTML,这可能非常烦人。

echo DOMinnerHTML($doc->getElementsByTagName('body')->item(0));