1

我目前正在将 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 ......虽然我不确定我的问题是否与他们有关?

4

1 回答 1

1

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

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

例如,要使用 查找每个带有“example”类的 div XPath,您只需查询文档即可;

//div[@class="example"]

然后用api去掉节点,DOMDocument最后归一化,得到最终结果。

$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();
于 2013-01-31T23:27:25.637 回答