如何使用 PHP DOMDocument() 检索 child 元素内的值?
How to retrieve the value inside a child element using PHP DOMDocument()?
我有一个 $body
变量,我正在从 post 中检索它。用户可能会也可能不会 post 一张图片。
当它 post 是图片时,我必须检索有关图片的一些信息,而且有时用户可能会为图片写一个标题。
这是 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,
];
}
我有一个 $body
变量,我正在从 post 中检索它。用户可能会也可能不会 post 一张图片。
当它 post 是图片时,我必须检索有关图片的一些信息,而且有时用户可能会为图片写一个标题。
这是 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,
];
}