Php 剥离不在标记中的html

Php 剥离不在标记中的html,php,text,preg-replace,Php,Text,Preg Replace,我目前正在抓取一个网站,并拥有所有我需要的有用数据,尽管它附带了一些我不想要的数据 例如: <h2>Heading</h2> <p>Useful <a href="/foo">data</a></p> Rubbish <a href="/bar">data</a> <h2>heading</h2> 标题 有用的 垃圾 标题 因此,本质上我想删除所有未包含在h2或p标记中的文

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

例如:

<h2>Heading</h2>
<p>Useful <a href="/foo">data</a></p>
Rubbish <a href="/bar">data</a>
<h2>heading</h2>
标题
有用的

垃圾 标题
因此,本质上我想删除所有未包含在
h2
p
标记中的文本


是否有一个简单的函数/preg?

最懒惰的解决方案是使用phpQuery或仅使用以下函数:

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

它迭代body下面的所有标记,并隐式跳过文本节点。因此,您只需收集生成的->html()代码片段。

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

$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;
$doc=新文档;
$doc->loadXML('.$yourContent'');
$nodes=$doc->firstChild->childNodes;
$output='';
对于($i=0;$i<$nodes->length;$i++){
$node=$nodes->item($i);
如果($node->nodeType!==XML\u TEXT\u node){
$output.=$doc->saveXML($node);
}
}
echo$输出;

结果稍微好一点:

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

(相关)您正在使用哪个类来解析HTML?到目前为止,这是一个快速而肮脏的过程。(一个快速而肮脏的黑客项目)。我可以使用htmlpurifier,但如果我能帮上忙,我宁愿不使用。正如我所说,这只是懒惰:@mario这没什么错。不包括一个全新的图书馆可以被认为是懒惰!phpQuery是刮网的炸弹。