2010-01-13 36 views

回答

8

這不會告訴你,如果這是真的圖像。這隻會告訴你它似乎根據網址是:

$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類型可能是偉大的,但它的矯枉過正... – 2010-01-13 20:26:32

+1

最便捷的解決方案+1 – wprl 2010-01-13 20:26:40

+0

許多圖像託管網站提供的HTML網頁的圖像文件結尾的URL擴展 – 2010-01-13 20:30:58

14

檢查文件的MIME類型。

+0

最健壯的解決方案+1 – wprl 2010-01-13 20:26:02

+1

但是這需要獲取文件。 OP想要從**語法知道它是否是一個圖像。不過,你的答案當然是對的。 – 2010-01-13 20:34:15

+0

你說得對。我的錯。無論如何''/ \。(png | jpg | gif | bmp)$/i''不是一個好的(安全)方法,但它當然更快更簡單。 – kjagiello 2010-01-13 20:36:37

3

非圖片網址仍然可以回傳圖片。例如,ashx或asp網址可能會返回圖像數據。最好的方法是檢查MIME類型,Response.ContentType。

+0

我upvoted,但即使在響應中的內容類型可以僞造或錯誤。 – cjstehno 2010-01-13 20:29:09

5

我建議作出HTTP HEAD請求,所以你不需要下載整個圖像,然後根據返回的字符串解析,並確保在Content-Type是image/jpegimage/pjpegimage/gifimage/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

緩存控制:最大年齡= 604800

內容長度:3438

內容類型:image/png

Last-Mod指明分數:孫老師,2010年1月10日 9點14分52秒GMT

接受-範圍:字節

的ETag: 「32741b5ed591ca1:0」

服務器:Microsoft-IIS/7.5

日期:星期三,2010 20時37分47秒GMT

'(長度= 256)

該內容 - 典型值1月13日電子郵件頭可以被欺騙,當然..但99%的時間不會,這就是爲什麼這種方法是可靠的。

+1

響應中的內容類型可能是僞造的。 – kjagiello 2010-01-13 20:34:28

+2

「這應該工作99%的情況。」 – 2010-01-13 20:35:54

1

我提出了preg解決方案,但如果真的,真的想知道然後下載文件和使用系統函數進行詢問(例如,通過exec使用file)。

2

如果您確實需要100%確定,則需要下載資源並使用getimagesize()進行檢查。

+0

這就是我在想的,但他想要一個語法檢查。 +1雖然。 – Aif 2010-01-13 20:59:59

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

相關問題