如何使用PHPCrawler使用PHP删除某些标记和内容
我目前正在一个网站上使用PHPCrawler进行一些搜索功能。我需要从索引中删除一些页面元素 例如,我使用了:如何使用PHPCrawler使用PHP删除某些标记和内容,php,dom,phpcrawl,Php,Dom,Phpcrawl,我目前正在一个网站上使用PHPCrawler进行一些搜索功能。我需要从索引中删除一些页面元素 例如,我使用了: $doc_body = preg_replace('/<li>(.*?)<\/li>/is', "", $doc_body); $doc\u body=preg\u replace('/(.*?)/is','',$doc\u body); 删除列表,因为我不希望列表出现在结果中。这正是它应该发挥的作用 现在,我还需要删除以下内容: <div class
$doc_body = preg_replace('/<li>(.*?)<\/li>/is', "", $doc_body);
$doc\u body=preg\u replace('/(.*?)/is','',$doc\u body);
删除列表,因为我不希望列表出现在结果中。这正是它应该发挥的作用
现在,我还需要删除以下内容:
<div class="example">all contents within</div>
中的所有内容
为此,我尝试了:
$doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body);
$doc\u body=preg\u replace(“/(.*?)/is',”,$doc\u body);
这会产生一个错误,因为可能不是每个页面都有div类示例。
因此,我用以下代码对其进行了修改:
if(strpos($doc_body,'<div class="example">')){
$doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body);
}
if(strpos($doc_body,')){
$doc_body=preg_replace(“/(.*?)/is”“,”,$doc_body);
}
不幸的是,这也不起作用!它不会产生错误,但不会从结果中删除所有内容
这是我第一次使用phpcrawler或Domdocument…虽然我不确定我这里的问题是否与它们有关?我建议您看看它,它用于查询文档模型,与CSS非常相似,但语法有点不同。W3学校有一个关于XPath的轻量级教程 在解析整个文档时,正则表达式总是一个坏主意,因为它既占用大量资源又耗时 例如,要使用
XPath
查找类为“example”的每个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();
$doc=newDOMDocument();
$xpath=新的DOMXPath($doc);
$doc->loadHTML($html);
//删除所有列表
foreach($xpath->query(//ul |//ol)作为$node){
$node->parentNode->removeChild($node);
}
//删除所有节点
foreach($xpath->query(//div[@class='example'])作为$node){
$node->parentNode->removeChild($node);
}
$doc->normalize();
//获取用于索引的最终文档
$html=$doc->saveHTML();
我建议您看看和,它与CSS非常相似,用于查询文档模型,但语法有点不同。W3学校有一个关于XPath的轻量级教程
在解析整个文档时,正则表达式总是一个坏主意,因为它既占用大量资源又耗时
例如,要使用XPath
查找类为“example”的每个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();
$doc=newDOMDocument();
$xpath=新的DOMXPath($doc);
$doc->loadHTML($html);
//删除所有列表
foreach($xpath->query(//ul |//ol)作为$node){
$node->parentNode->removeChild($node);
}
//删除所有节点
foreach($xpath->query(//div[@class='example'])作为$node){
$node->parentNode->removeChild($node);
}
$doc->normalize();
//获取用于索引的最终文档
$html=$doc->saveHTML();
回答得很好……谢谢你给我指出了正确的方向。以下是我的问题的具体解决方案,但我需要熟悉xpath:foreach($xpath->query(//div[@class='example'])as$node){$node->parentNode->removeChild($node)是的,很抱歉。我已经有一段时间没有实现DOMDocument了。我已经更新了我的答案。很好的答案…谢谢你给我指明了正确的方向。以下是解决我问题的具体方法,但我需要熟悉xpath:foreach($xpath->query(“//div[@class='example'])as$node){$node->parentNode->removeChild($node);
是的,很抱歉。我已经有一段时间没有实现DOMDocument了。我已经更新了我的答案。