PHP Простой HTML DOM не может читать "data-src" или "img src" без http: по пути

64
7

Я работаю с PHP Simple HTML DOM и только что обнаружил, что он не может читать изображения из атрибута data-src или <img src без http: eg; <img src="//static.mysite.com/123.jpg">

Есть ли способ сделать это возможным?

Мой код:

if($htm->find('img')){
foreach($htm->find('img') as $element) {
$raw = file_get_contents_curl($element->src);
$im = @imagecreatefromstring($raw);
$width = @imagesx($im);
$height = @imagesy($im);
if($width>500&&$height>=350){
$hasimg = '1';
echo '<img src=\'' .$element->src. '\'>';
}

} // end foreach
} // end if htm

спросил(а) 2021-01-19T16:16:40+03:00 6 месяцев назад
1
Решение
100

Меня устраивает:

$doc = str_get_html('<img data-src="foo">');
echo $doc->find('img', 0)->getAttribute('data-src');
//=> outputs: foo

ответил(а) 2021-01-19T16:16:40+03:00 6 месяцев назад
45

Если вы используете file_get_contents_curl() как функцию, определенную в вашем коде, например, в этом вопросе, вам нужно установить протокол по умолчанию для cURL:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);

Таким образом, если атрибут src изображения имеет относительный URL-адрес протокола, cURL будет использовать HTTP.

ответил(а) 2021-01-19T16:16:40+03:00 6 месяцев назад
45

Оставляя протокол (http/https), называется "ссылка на сетевой путь" и означает, что должен использоваться протокол страницы, в которую вставлен URL. Это не имеет никакого отношения к file_get_contents() или curl, потому что они не знают ни одной страницы.

Короче говоря, вам нужно добавить протокол самостоятельно.

Попробуй это:

$url=$element->src;
if (substr($url, 0, 2)=='//') $url='http:'.$url;
$raw=file_get_contents_curl($url);

ответил(а) 2021-01-19T16:16:40+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема