2010-01-13 3 views
4

Я хочу знать из синтаксиса, если URL-адрес является картиной или нет. пример: http://www.blah.com/plo52.jpg или png или gif вернет true. , если URL-адрес заканчивается другим расширением, функция вернет false.Как определить, является ли URL-адрес изображением или нет?

Благодаря

+17

Расширение не будет сказать вам, является ли это на самом деле изображение. –

ответ

8

Это не скажет вам, если это на самом деле изображение. Это будет только сказать вам, что это появляется быть в соответствии с URL:

$url = "http://somedomain.com/images/kittens.jpg"; 
if(preg_match("/\.(png|jpeg|jpg|gif|bmp)$/i", $url)) { 
    print "Appears to be an image"; 
} else { 
    print "Not an image."; 
} 

Выходы:

 Appears to be an image

Обратите внимание, что если вы ожидаете увидеть изображения, подаваемые через .php скрипты или скрипты .aspx , этот метод не удастся. Чтобы иметь действительно надежный тест, вам нужно проверить тип mime.

+1

+1, иногда вам нужно реализовать что-то простое и эффективное, проверка типа mime может быть отличной, но ее overkill imo .... –

+1

наиболее подходящее решение +1 – wprl

+0

Многие хостинг-сайты изображений служат HTML-странице для URL-адресов, заканчивающихся в файле изображения extensions –

14

Проверьте файл типа mime.

+0

наиболее надежное решение +1 – wprl

+1

Но для этого требуется извлечь файл. OP хотел узнать из синтаксиса **, если это изображение или нет. Тем не менее, ваш ответ, конечно, прав. –

+0

Вы правы. Виноват. Во всяком случае, ''/\. (Png | jpg | gif | bmp) $/i'' тоже не является хорошим (безопасным) способом, но он быстрее и проще. – kjagiello

3

URL-адреса без изображения могут по-прежнему передавать обратные изображения. Например, URL-адрес ashx или asp может возвращать вам данные изображения. Лучший способ - проверить тип MIME, Response.ContentType.

+0

Я одобрил, но даже тип содержимого в ответе может быть сфальсифицирован или просто ошибочен. – cjstehno

5

Я предлагаю сделать HTTP ГОЛОВА запрос так что вам не нужно, чтобы загрузить все изображение, а затем на основе строки, возвращаемой разборе и убедитесь, что Content-Type является image/jpeg, image/pjpeg, image/gif, image/png или Аналогичное изображение Типы содержимого.

<?php 

function parseImage($url) { 
     $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 

    $content = curl_exec($ch); 

    var_dump($content); 
    curl_close($ch); 
} 

parseImage('http://sstatic.net/so/img/logo.png'); 

Возвращает

строка «HTTP/1.1 200 OK

Cache-Control: макс возраста = 604800

Content-Length: 3438

Content-Type : image/png

Last-Mod маньяков: Sun, 10 Jan 2010 9:14:52 GMT

Accept-Диапазоны: байт

ETag: "32741b5ed591ca1: 0"

Сервер: Microsoft-IIS/7.5

Дата Ср, 13 января 2010 20:37:47 GMT

'(длина = 256)

Content-Typ e заголовок может быть подделан, конечно .. но в 99% случаев его не будет, поэтому этот метод является надежным.

+1

Тип содержимого в ответе может быть сфальсифицирован. – kjagiello

+2

«Это должно работать в 99% случаев». –

1

Я одобрил решение preg, но если вы действительно, ДЕЙСТВИТЕЛЬНО хотите узнать, затем загрузите файл и выполните опрос с использованием системных функций (например, для использования linux file через exec).

2

Если вам действительно нужно быть на 100% уверенным, вам необходимо загрузить ресурс и проверить его, используя getimagesize().

+0

Это то, о чем я думал, но он хочет проверить синтаксис. +1 хотя. – Aif

1

Вы можете использовать pathinfo для получения расширения:

echo pathinfo('http://www.blah.com/plo52.jpg', PATHINFO_EXTENSION); // jpg 

затем оберните его в функцию

function hasExtension($uri, array $extensions = array('jpg','gif','png')) 
{ 
    return in_array(pathinfo($uri, PATHINFO_EXTENSION), $extensions); 
} 

hasExtension('http://www.blah.com/plo52.jpg'); // true 

Это также будет работать на обычных путях к файлам и, будучи в состоянии передать $ расширение массив, вы не ограничены шаблоном регулярного выражения. Обратите внимание, что функция чувствительна к регистру.

Смотрите этот вопрос и ответы на how to best determine the MimeType of a file:

Смежные вопросы