如何使用PHPCrawler删除PHP中的某些标签和内容

时间:2013-01-31 23:15:30

标签: php dom phpcrawl

我目前正在使用PHPCrawler来获取网站上的某些搜索功能。我需要从索引中删除一些页面元素。

例如,我使用过:

$doc_body = preg_replace('/<li>(.*?)<\/li>/is', "", $doc_body);

删除列表,因为我不希望结果中列出。这完全符合预期。

现在,我需要删除的另一件事是:

<div class="example">all contents within</div>

所以我试过这个:

   $doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body);

这会产生错误,因为可能并非每个页面都有div类示例。 所以我使用以下代码对其进行了调整:

      if(strpos($doc_body,'<div class="example">')){
      $doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body);
      }

遗憾的是,这也不起作用!它不会产生错误,但不会删除结果中的所有内容。

这是我第一次使用phpcrawler或Domdocument ...虽然我不确定我的问题是否与他们有任何关系?

1 个答案:

答案 0 :(得分:1)

我建议您查看DOMDocumentXPath,它用于查询文档模型,就像CSS一样,但语法略有不同。 W3Schools有一个关于XPath here的轻量级教程。

正则表达式在解析整个文档时总是一个坏主意,因为它既耗费资源又耗时。

例如,要使用XPath查找类“示例”的每个div,您只需查询文档;

//div[@class="example"]

然后删除带有DOMDocument api的节点,最后进行规范化,以获得最终结果。

$doc = new DOMDocument();
$xpath = new DOMXPath($doc);
$doc->loadHTML($html);

// Remove all the lists
foreach ($xpath->query("//ul | //ol") as $node) {
     $node->parentNode->removeChild($node);
}

// Remove all <div class="example" /> nodes
foreach ($xpath->query("//div[@class='example']") as $node) {
     $node->parentNode->removeChild($node);
}

$doc->normalize();

// Get the final document for indexing
$html = $doc->saveHTML();