Как извлечь URL-адрес изображения из div?

#php #css #url #string-parsing

#php #css #url #синтаксический анализ строк

Вопрос:

Я хочу извлечь URL-адрес фонового изображения из div с помощью PHP. Я хочу выполнить поиск по классу в строке и извлечь URL-адрес фонового изображения.

Например:

 <div class="single-post-image" style="background-image: url(https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg)"></div>
 

Это тот результат, который я хочу:

 https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg
 

Ответ №1:

Вы могли бы использовать прямое регулярное выражение, но лично я бы вычеркнул только те элементы, которые вам нужны, с помощью dom document /xpath, а затем регулярно выражал значение из стиля.

 <?php
$html = '
<html><head></head><body>
<div class="single-post-image" style="background-image:url(https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg)"></div>
<div class="single-post-image" style="background-image: url(https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg )"></div>
<div class="single-post-image" style="background-image: url( https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg)"></div>
<div class="single-post-image" style="background-image: url('https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg')"></div>
<div class="single-post-image"></div>
</body>
</html>';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

$xpath = new DomXPath($dom);

$images = [];
foreach ($xpath->query("//*[contains(@class, 'single-post-image')]") as $img) {
    if ($img->hasAttribute('style')) {
        preg_match('/url((.*))/', $img->getAttribute('style'), $match);
        if (isset($match[1])) $images[] = trim($match[1], ''" ');
    }
}

print_r($images);
 

Результат:

 Array
(
    [0] => https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg
    [1] => https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg
    [2] => https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg
    [3] => https://www.mmowg.net/wp-content/uploads/2020/11/a8Tnv1kVyXY.jpg
)
 

Пример: https://3v4l.org/icTdS

Немного больше кода, но мне хотелось бы верить, что он более надежный и эффективный, чем регулярное выражение поверх массивного HTML-документа.

Ответ №2:

Это должно сработать:

 preg_match_all('/background-image: url((.*?))/', $your_html, $output, PREG_SET_ORDER);
 

Измените последний параметр, чтобы получить вывод в форме (массиве) по вашему усмотрению: https://www.php.net/manual/en/function.preg-match-all.php