首页 > 解决方案 > 如何使用 Xpath 将内容与两个标签进行比较

问题描述

我有以下 $html 内容的场景。我想检查 html 内容是否以没有任何文本内容的媒体(图像或视频,iframe)开头,如第 3 种场景。

//第一个p标签和图片标签之间没有内容

   $html =  '<p dir="ltr"><img src="imageurl"  class="img"><br></p>
    <div>some content </div>';

//第一个p标签和video标签之间没有内容

 $html =  '<p dir="ltr"><video width="320" height="240" controls>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
  Your browser does not support the video tag.
</video></p>
<div>some content </div>';

//在第一个p标签内有内容

 $html =  '<p dir="ltr">here we have text<img src="imageurl"  class="img"><br></p>
<div>some content </div>';

我试过这样但没有运气,请指教

$dom = new DOMDocument();
$dom->loadHTML($html);//that's HTML of my document, string
$xpath = new DOMXPath($dom);
$xpath_resultset =  $xpath->query("p/following-sibling::node()[not(preceding-sibling::img) and not(self::img)]");

标签: phphtmlxpath

解决方案


由于 p 是根节点,因此您需要在开头添加一个斜杠。

如果第一个内容是带有文本的 text(),则检查 p

/p[node()[1][self::text()][normalize-space()!='']]

如果第一个内容(忽略空格)是 img 或 video,则检查 p

/p[(video|img)[not(preceding-sibling::text()[normalize-space()!=''])]]

两个 XPath 都将忽略子节点之间的非预期空白。

因此,即如果 p 是这样的:

<p dir="ltr"> <img src="imageurl"  class="img"/><br/></p>

第二个 XPath 会找到它,而不是第一个。

如果你想匹配一个完整的 html 文件中的所有 p,你可以使用:

//p[node()[1][self::text()][normalize-space()!='']]

//p[(video|img)[not(preceding-sibling::text()[normalize-space()!=''])]]

推荐阅读