php - 如何使用 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)]");
解决方案
由于 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()!=''])]]
推荐阅读
- select - 无法为选择查询提取数据,日期之间除外
- vb.net - 为什么 windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放?
- swift - 观察者导致 AVFoundation captureOutput 方法滞后
- design-patterns - 将主题映射到他们的观察者 - 观察者模式 GoF 书
- angular - 使用 Angular CLI 6 运行 ng serve Angular 4,有可能吗?
- python - 从 wordcloud 导入 WordCloud 失败
- spring - Spring Cloud Zuul + Undertow + OAuth2:无法登录Zuul
- typescript - 检测组件何时取消/附加到 DOM
- sql - 从 SQL Server 2016+ 创建 JSON(用于 JSON 路径命令)
- android - 为什么这些 dp 单位在同一个 Layout 中渲染的厚度是原来的两倍?