剥离不在标签中的html

时间:2011-02-14 22:53:34

标签: php text preg-replace

我正在抓取一个网站并拥有我需要的所有有用数据,尽管它附带了一些我不想要的数据。

示例:

<h2>Heading</h2>
<p>Useful <a href="/foo">data</a></p>
Rubbish <a href="/bar">data</a>
<h2>heading</h2>

所以基本上我想删除所有未被h2p标记包围的文字。

是否有简单的功能/ preg?

3 个答案:

答案 0 :(得分:1)

最懒的解决方案是使用phpQuery或QueryPath只使用:

foreach (qp($html)->find("body *") as $node) {
    echo $node->html(), "\n";
}

迭代正文下方的所有标记,并隐含地跳过文本节点。所以你只需要收集结果 - &gt; html()片段。

答案 1 :(得分:1)

最好的方法是使用PHP的DOMDocument类。这与mario's answer非常相似,只是它不需要一个全新的库。

$doc = new DOMDocument;
$doc->loadXML('<root>' . $yourContent . '</root>');

$nodes = $doc->firstChild->childNodes;

$output = '';
for ($i = 0; $i < $nodes->length; $i++) {
    $node = $nodes->item($i);
    if ($node->nodeType !== XML_TEXT_NODE) {
        $output .= $doc->saveXML($node);
    }
}

echo $output;

答案 2 :(得分:0)

结果好一点:

preg_match_all('~<h2>.*?<\/h2>|<p>.*?<\/p>~i', $str, $new);