我想從語法中知道url是否爲圖片。 例如:http://www.blah.com/plo52.jpg或png或gif將返回true。 如果網址以其他擴展名結尾,則該函數將返回false。如何確定一個url是否是一個圖像?
感謝
我想從語法中知道url是否爲圖片。 例如:http://www.blah.com/plo52.jpg或png或gif將返回true。 如果網址以其他擴展名結尾,則該函數將返回false。如何確定一個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,有時你必須實現一些簡單而有效的,檢查MIME類型可能是偉大的,但它的矯枉過正... – 2010-01-13 20:26:32
最便捷的解決方案+1 – wprl 2010-01-13 20:26:40
許多圖像託管網站提供的HTML網頁的圖像文件結尾的URL擴展 – 2010-01-13 20:30:58
非圖片網址仍然可以回傳圖片。例如,ashx或asp網址可能會返回圖像數據。最好的方法是檢查MIME類型,Response.ContentType。
我upvoted,但即使在響應中的內容類型可以僞造或錯誤。 – cjstehno 2010-01-13 20:29:09
我建議作出HTTP HEAD請求,所以你不需要下載整個圖像,然後根據返回的字符串解析,並確保在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
緩存控制:最大年齡= 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%的時間不會,這就是爲什麼這種方法是可靠的。
響應中的內容類型可能是僞造的。 – kjagiello 2010-01-13 20:34:28
「這應該工作99%的情況。」 – 2010-01-13 20:35:54
我提出了preg解決方案,但如果真的,真的想知道然後下載文件和使用系統函數進行詢問(例如,通過exec使用file
)。
可以使用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:
使用headers_list然後檢查內容類型http://php.net/manual/en/function.headers-list.php
你可能是指'get_headers()'。 'header_list'返回已經從你的服務器發送**的頭文件 – Gordon 2010-01-13 21:36:49
擴展不會告訴你它是否真的是一個圖像。 – 2010-01-13 20:22:17