尝试找到没有特定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);
答案 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"))]]