Получить значение src из функции?

216
10 апреля 2018, 04:16

Извиняйте, если не корректно сформировал вопрос. Суть следующая, есть вот такой код:

foreach($group AS $product){
if (isset($product['group_title']) && $product['group_title']) {
$group_id++;
...
if ($parametri["show_image"] == 1) {
if (isset($product['images'])) {
$firsttime = true;
echo '<td class="cell_image">';
foreach ($product['images'] as $image) {
if ($firsttime) {
echo $image->displayMediaThumb('class="product-image"', true, 'rel="catproduct_images_'.$i.'"', true, false);
$firsttime = false;
} else {
echo '<a title="'.$image->product_name.'" rel="catproduct_images_0" href="'.$image->file_url.'"></a>';
}
}
echo '</td>';
}
else {
echo '<td class="cell_image"></td>';
}
}
...
$i++;

Он генерирует html строки с изображением. Мне нужно вытащить из него SRC картинки. Как это сделать ума не приложу, вроде бы просто, ан нет... Помогите разобраться... Заранее благодарю за ответ

<td class="cell_image"><a title="fMEWGS151041" rel="catproduct_images_0" href="https://makcon.ru/images/stories/virtuemart/product/fMEWGS151041.jpg"><img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" alt="fMEWGS151041" class="product-image" /></a></td>
Answer 1

Если картинка одна, то можно вытащить ссылку из атрибута src с помощью preg_match():

$str = '<td class="cell_image"><a title="fMEWGS151041" rel="catproduct_images_0" href="https://makcon.ru/images/stories/virtuemart/product/fMEWGS151041.jpg"><img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" alt="fMEWGS151041" class="product-image" /></a></td>';
preg_match('~(?<=src=")[^"]+(?=")~', $str, $arr);
$img = $arr[0] ?? '';
echo $img;

В результате будет строка:

/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg

Если на входе у вас массив, то нужно обрабатывать его в цикле (или подходящими php-функциями), проверяя каждый элемент массива на наличие атрибута src="...". Так как в результате уточняющих комментариев не выяснилось, что именно нужно обрабатывать (строку или массив), то я решил написать универсальную функцию, которая будет принимать на вход строку или массив, а в результате возвращать всегда массив (если совпадений не найдено - пустой массив). Код функции:

function get_url($images, $img = []): Array
{
    $pcre = function($html)use(&$img){
        preg_match('~(?<=src=")[^"]+(?=")~', $html, $arr);
        empty($arr[0]) ?: $img[] = $arr[0];
    };
    if (is_array($images)) {
        foreach ($images as $html) {
            $pcre($html);
        }
    } else {
        $pcre($images);
    }
    return $img;
}

Пример использования для массива:

$images = [
    '<p><img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" /></p>',
    '<p><img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" /></p>',
    '<p><img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" /></p>',
    '<img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" />',
    '<img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" />'
];
var_dump( get_url($images) );

Результат:

array (size=5)
  0 => string '/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg' (length=64)
  1 => string '/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg' (length=64)
  2 => string '/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg' (length=64)
  3 => string '/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg' (length=64)
  4 => string '/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg' (length=64)

Пример использования для строки:

$image = '<p><img src="/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg" /></p>';
var_dump( get_url($image) );

Результат:

array (size=1)
  0 => string '/images/stories/virtuemart/product/resized/fMEWGS151041_0x80.jpg' (length=64)

В контексте вашего кода использование будет выглядеть примерно так:

// Объявить мвссив
$images = [];
foreach ($group AS $product) {
    if (isset($product['group_title']) && $product['group_title']) {
        $group_id++;
        if ($parametri["show_image"] == 1) {
            if (isset($product['images'])) {
                $firsttime = true;
                echo '<td class="cell_image">';
                foreach ($product['images'] as $image) {
                    if ($firsttime) {
                        // Сохранить результат из метода во временную переменную $temp
                        $temp = $image->displayMediaThumb('class="product-image"', true, 'rel="catproduct_images_'.$i.'"', true, false);
                        // Передать переменную в get_url(), и получить массив
                        $images[] = get_url($temp);
                        $firsttime = false;
                    } else {
                        echo '<a title="'.$image->product_name.'" rel="catproduct_images_0" href="'.$image->file_url.'"></a>';
                    }
                }
                echo '</td>';
            }
            else {
                echo '<td class="cell_image"></td>';
            }
        }
        $i++;
    }
}
// Просмотр полученного массива
var_dump( $images );
Answer 2

Эх, а ларчик просто открывался ))) Суть решения была на поверхности, а именно:

echo '<a title="'.$image->product_name.'" rel="catproduct_images_0" href="'.$image->file_url.'"></a>';

}

тут есть href="'.$image->file_url.'" это и есть ключ к победе )))

$img_src = "/".$image->file_url;

написал вот так чтобы получить путь к картинке далее, был обработчик РАДИО переключатель к нему добавил это:

data-imag="'.$img_src.'"

затем пошел в JS файл обработчика событий радио-переключателя и там:

var d_img = checkboxes[index].getAttribute('data-imag');

получил атрибут ссылки, далее вернул куда мне надо было, вот так:

document.querySelector('img[class="info_cpu"]').setAttribute('src', d_img);

что получил: при клике на радио, вывел инфу о выборе + картинку, для наглядности ссылка на сайт: https://makcon.ru/catalog/create-pc кому интересно, нажмите на иконку над словом "Процессоры" и покликайте на радио переключатели...

  • Огромное спасибо терпеливому форумчанину под ником "Эдуард"...
READ ALSO
Как удалять zip файл с сервера?

Как удалять zip файл с сервера?

Привет всем подскажите как удалять zip rar файлы из сервера ??

192
ATOM Linter error running PHP | Ошибка расширения на ATOM

ATOM Linter error running PHP | Ошибка расширения на ATOM

Возникла такая проблема:

197
Использование fscokopen вместе с proxy

Использование fscokopen вместе с proxy

Надо присоединится к серверу через fsockopen и отправить несколько пакетов, используя при этом прокси(обеспечить анонимность отправки пакетов)...

152
Регулярные выражения php

Регулярные выражения php

ЗдравствуйтеКак правильно составить регулярные выражения PHP, чтобы скрипт отдал ответ при обнаружении ПЕРВЫХ трех чисел - 789? Тоесть, к примеру,...

173