2011-02-14 128 views
1

我目前正在抓取一个网站并获取所需的所有有用数据,虽然它带有一些我不想要的数据。不带标签的带状图标

例子:

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

所以基本上我想要删除而不被任何h2p标记之间的所有文本。

有没有简单的函数/ preg?

+1

*(相关)* [最佳方法来解析HTML(http://stackoverflow.com/questions/3577641/best-methods-to-parse -html/3577662#3577662) – Gordon 2011-02-14 22:57:33

+0

您正在使用哪个类来解析HTML? – Eray 2011-02-14 22:58:50

+0

它是一个快速和肮脏的preg到这一点。 (一个快速和肮脏的黑客项目)。可以使用htmlpurifier,但宁可不,如果我可以帮助它。 – bluedaniel 2011-02-14 23:01:00

回答

0

结果是小有一点好:

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

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

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

它遍历下面身上所有的标签,并隐含跳过文本节点。所以你只需要收集结果 - > html()片段。

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;