我正在抓取一个网站并拥有我需要的所有有用数据,尽管它附带了一些我不想要的数据。
示例:
<h2>Heading</h2>
<p>Useful <a href="/foo">data</a></p>
Rubbish <a href="/bar">data</a>
<h2>heading</h2>
所以基本上我想删除所有未被h2
或p
标记包围的文字。
是否有简单的功能/ preg?
答案 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);