Как получить значение внутри дочернего элемента с помощью PHP DOMDocument ()? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть переменная $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, и он не работает.

Что мне не хватает?

1 Ответ

1 голос
/ 17 июня 2019

Что вы можете сделать, это посмотреть на следующий элемент из тега <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,
    ];
}
...