检查元素的Xpath在PHP中不包含特定的src属性

时间:2014-03-09 13:30:27

标签: php xpath domdocument

尝试找到没有特定img src的元素,但是抓住变量中的所有元素而不是我想要的元素,也导致循环无限循环

  $books = '<div> stuff heer < img src ="/assets/images/post/books.svg"/ ></div>';             
$books2 = array();
                  foreach($books as $v)
                  {
                        $dom = new DOMDocument;
                        @$dom->loadHTML($v);
                        $xpath = new DomXpath($dom);
                        $div = $xpath->query('//*[not(contains(src,"/assets/images/post/books.svg"))]');    
                        foreach ($div as $a) {
                            if(!empty($a))
                            {
                                $books2[] = $v;
                            }
                        }                   
                  }     var_dump($books2); //problem is that this dumps all elements from initial books array and also oddly loops indefinitely..

然而,如果我尝试下面的代码,它可以正常工作并输出正确的...任何想法为何上述不起作用?

     $books2 = array();
      foreach($books as $v)
      {
            $dom = new DOMDocument;
            @$dom->loadHTML($v);
            $xpath = new DomXpath($dom);
            $div = $xpath->query('//*[@src="/assets/images/post/books.svg"]');    
            foreach ($div as $a) {
                if(!empty($a))
                {
                    $books2[] = $v;
                }
            }                   
      }     var_dump($books2);

2 个答案:

答案 0 :(得分:2)

代码存在问题;第一个是src@src是两个不同的东西,前者是元素,后者是属性。

其次,查询不够受限;它查询所有没有src属性的节点,而你只想找到图像,即:

//img[not(contains(@src,"/assets/images/post/books.svg"))]

最后,根据您的问题,您似乎有兴趣知道是否存在至少一个此类元素,在这种情况下您不必执行任何内部循环:

$n = $xpath->query('//img[not(contains(@src,"/assets/images/post/books.svg"))]')->length;

if ($n) {
    $books2[] = $v;
}

答案 1 :(得分:1)

在第一个代码块中,引用src属性时缺少@

这使表达式选择所有不包含src 元素 的元素包含“/assets/images/post/books.svg”(这是所有元素)在文档中),而不是选择具有src属性的元素,其值不包含该字符串。 但是,这仍然会选择文档中的大多数元素。

您想要选择具有@src 的所有元素 ,并确保@src属性的值不包含该路径:

//*[@src[not(contains(.,"/assets/images/post/books.svg"))]]