php - 如何使用 PHP DOMDocument() 检索子元素内的值?
问题描述
我有一个$body
从帖子中检索的变量。用户可以发布也可以不发布图片。
当它发布图片时,我必须检索有关图片的一些信息,有时用户可能会为图片写标题。
这是没有标题的 html :
<figure class="image"><img src="/storage/5/articles/pictures/asdf87.jpeg"></figure>
这是一个带有标题的示例:
<figure class="image"><img src="/storage/5/articles/pictures/asdf87.jpeg"><figcaption>test_caption</figcaption></figure>
这是我到目前为止的代码:
$body = '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse at dictum lectus. Ut volutpat pulvinar dui, quis elementum est bibendum sit amet. Curabitur a tempor augue. Nulla bibendum porttitor lacinia. Pellentesque tempor sem sed condimentum lobortis. Duis vulputate ante vel enim auctor luctus.</p><figure class="image"><img src="/storage/5/articles/pictures/1560793567749_d20caec3b48a1eef164cb4ca81ba2587.jpeg"><figcaption>tudo de ensaio</figcaption></figure><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse at dictum lectus. Ut volutpat pulvinar dui, quis elementum est bibendum sit amet. Curabitur a tempor augue. Nulla bibendum porttitor lacinia. Pellentesque tempor sem sed condimentum lobortis. Duis vulputate ante vel enim auctor luctus.</p><figure class="image"><img src="/storage/5/articles/pictures/1560793584944_4c614360da93c0a041b22e537de151eb.jpeg"><figcaption>tb ensaio gota</figcaption></figure><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse at dictum lectus. Ut volutpat pulvinar dui, quis elementum est bibendum sit amet. Curabitur a tempor augue. Nulla bibendum porttitor lacinia. Pellentesque tempor sem sed condimentum lobortis. Duis vulputate ante vel enim auctor luctus.</p><figure class="image"><img src="/storage/5/articles/pictures/1560793600192_21ae1a72068eff5f1c6e0238501b06a6.jpeg"><figcaption>tb ens colors</figcaption></figure><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse at dictum lectus. Ut volutpat pulvinar dui, quis elementum est bibendum sit amet. Curabitur a tempor augue. Nulla bibendum porttitor lacinia. Pellentesque tempor sem sed condimentum lobortis. Duis vulputate ante vel enim auctor luctus.</p>' ;
$dom_err = libxml_use_internal_errors(true);
$dom = new \DOMDocument();
$dom->loadHtml($body, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new \DOMXPath($dom);
$imgs = [];
foreach ($xpath->query("//figure/img") as $img) {
$src = $img->getAttribute('src');
if (preg_match('#/storage/(.*)/articles/pictures/(.*)#', $src, $result)) {
$imgs[] = [
'id' => $result[1],
'name' => $result[2],
'caption' => $img->item(0)->textContent,
];
}
}
libxml_clear_errors();
libxml_use_internal_errors($dom_err);
我正在尝试检索这部分代码中的标题,'caption' => $img->item(0)->textContent
但它不起作用。
我错过了什么?
解决方案
您可以做的是查看<img>
标签中的下一个元素(使用nextSibling
),如果这是一个<figcaption>
元素,则将标题文本设置为其文本内容,否则将其设置为空白...
if (preg_match('#/storage/(.*)/articles/pictures/(.*)#', $src, $result)) {
$caption = $img->nextSibling;
if ( $caption->localName == "figcaption" ) {
$captionText = $caption->textContent;
}
else {
$captionText = "";
}
$imgs[] = [
'id' => $result[1],
'name' => $result[2],
'caption' => $captionText,
];
}
推荐阅读
- javascript - 录音机脚本适用于除 Edge 浏览器以外的大多数浏览器
- r - 将 R 对象上传到 Azure Blob 容器
- angular - ionic3 在搜索地址时设置离子输入超时
- python - 在使用“queryset”而不是使用“def get_queryset(self)”时检索“self”值的替代方法
- arrays - SwiftUI - 如何从 Identifiable 结构中读取字符串数组
- css - CSS滑动与粘性顶部菜单栏重叠
- c++ - 在具有结构的 C++ 函数中使用指针的最佳实践
- reactjs - 在 React 中使用 .map() 生成一个组件时,如何让一个组件与另一个组件通信?
- numpy - numpy 在维度上连接
- java - java中的插入排序算法