我目前正在使用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 ...虽然我不确定我的问题是否与他们有任何关系?
答案 0 :(得分:1)
我建议您查看DOMDocument和XPath,它用于查询文档模型,就像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();