如何使用PHPCrawler使用PHP删除某些标记和内容

如何使用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

我目前正在一个网站上使用PHPCrawler进行一些搜索功能。我需要从索引中删除一些页面元素

例如,我使用了:

$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了。我已经更新了我的答案。