Home>Article>Backend Development> PHP determines whether the link is an image

PHP determines whether the link is an image

尚
Original
2019-10-28 16:21:05 6106browse

PHP determines whether the link is an image

Method 1

Directly matches the URL link with .png, .gif, .jpg, .jpeg.

preg_match('/.*(\.png|\.jpg|\.jpeg|\.gif)$/', $url);

This is the simplest way, but it is not accurate enough because not all image links end with the image name extension.

Method 2

Use CURL to get the response header of the image URL

First create a curl and output the header file information as a data stream

$url = "http://*************"; //图片的链接地址 $ch = curl_init(); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //是否跟着爬取重定向的页面 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的值以文本流的形式返回,而不是直接输出。 curl_setopt($ch, CURLOPT_HEADER, 1); // 启用时会将头文件的信息作为数据流输出 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); //设置超时时间 curl_setopt($ch, CURLOPT_URL, $url); //设置URL $content = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); //curl的httpcode $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); //获取头大小 curl_close($ch);

At this time, the content contains the header information and the binary content of the image, and then intercepts the header information according to the size of the header ($headerSize), and the rest is the binary content of the image.

$headers = substr($content, 0, $headerSize); //根据头大小截取头信息

The header information output structure is as follows

HTTP/1.1 200 OK Server: JSP3/2.0.14 Date: Sun, 30 Jul 2017 06:54:47 GMT Content-Type: image/jpeg Content-Length: 152094 Connection: keep-alive ETag: "7751852900776331536" Last-Modified: Tue, 02 May 2017 10:33:16 GMT Expires: Wed, 18 Jul 2018 06:25:38 GMT Age: 879492 Cache-Control: max-age=31536000 Accept-Ranges: bytes Error-Message: OK Ohc-Response-Time: 1 0 0 0 0 0

You can see that there is Content-Type: image/jpeg, and then process the header information and take out the desired content

$head_data=preg_split('/\n/',$headers); //逐行放入数组中 $head_data = array_filter($head_data); //过滤空数组 $headers_arr = []; foreach($head_data as $val){ //按:分割开 list($k,$v) = explode(":",$val); //:前面的作为key,后面的作为value,放入数组中 $headers_arr[$k] = $v; } $img_type = explode("/",trim($headers_arr['Content-Type'])); //然后将获取到的Content-Type中的值用/分隔开 if ($httpcode == 200 && strcasecmp($img_type[0],'image') == 0) {//如果httpcode为200,并且Content-type前面的部分为image,则说明该链接可以访问成功,并且是一个图片类型的 $type = $img_type[1]; ............. } else {//否则........ ............ }

Method 3

Using PHP's get_headers() function, you can directly obtain the response header information, but compared to curl, you cannot set a timeout.

Array ( [0] => HTTP/1.1 200 OK [1] => Date: Sat, 29 May 2004 12:28:13 GMT [2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT [4] => ETag: "3f80f-1b6-3e1cb03b" [5] => Accept-Ranges: bytes [6] => Content-Length: 438 [7] => Connection: close [8] => Content-Type: text/html ) Array ( [0] => HTTP/1.1 200 OK [Date] => Sat, 29 May 2004 12:28:14 GMT [Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux) [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT [ETag] => "3f80f-1b6-3e1cb03b" [Accept-Ranges] => bytes [Content-Length] => 438 [Connection] => close [Content-Type] => text/html )

Recommended:php server

The above is the detailed content of PHP determines whether the link is an image. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn