Используя PHP, учитывая URL-адрес, как определить, является ли это образ?
Нет контекста для URL-адреса - он находится только в середине простого текстового файла или, может быть, только строка сама по себе.
Мне не нужны высокие накладные расходы (например, чтение содержимого URL-адреса), так как это может быть вызвано для многих URL-адресов на странице. Учитывая это ограничение, не обязательно, чтобы все изображения были идентифицированы, но я хотел бы получить довольно хорошее предположение.
В данный момент я просто смотрю на расширение файла, но похоже, что должен быть лучший способ, чем это.
Вот что я сейчас имею:
function isImage( $url )
{
$pos = strrpos( $url, ".");
if ($pos === false)
return false;
$ext = strtolower(trim(substr( $url, $pos)));
$imgExts = array(".gif", ".jpg", ".jpeg", ".png", ".tiff", ".tif"); // this is far from complete but that always going to be the case...
if ( in_array($ext, $imgExts) )
return true;
return false;
}
Изменить: В случае, если это полезно для кого-то еще, это последняя функция, использующая технику из ответа Эмиля Н:
function isImage($url)
{
$params = array('http' => array(
'method' => 'HEAD'
));
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp)
return false; // Problem with url
$meta = stream_get_meta_data($fp);
if ($meta === false)
{
fclose($fp);
return false; // Problem reading data from url
}
$wrapper_data = $meta["wrapper_data"];
if(is_array($wrapper_data)){
foreach(array_keys($wrapper_data) as $hh){
if (substr($wrapper_data[$hh], 0, 19) == "Content-Type: image") // strlen("Content-Type: image") == 19
{
fclose($fp);
return true;
}
}
}
fclose($fp);
return false;
}