[PHP]获取网站ICO图标链接的方法,兼容ICO图标重定向的情景
作者:鹰该飞翔
阅读:507
发布时间:2021年12月21日 18:01
分享一个PHP获取网站ICO图标链接的方法,兼容ICO图标重定向的情景,代码如下
// 获取网站的ico文件路径
class Ico
{
/**
* 判断是否URL
* @param $url
* @return bool
*/
public static function isUrl($url){
return preg_match('/^http[s]?:\/\/'.
'(([0-9]{1,3}\.){3}[0-9]{1,3}'. // IP形式的URL- 199.194.52.184
'|'. // 允许IP和DOMAIN(域名)
'([0-9a-z_!~*\'()-]+\.)*'. // 三级域验证- www.
'([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.'. // 二级域验证
'[a-z]{2,6})'. // 顶级域验证.com or .museum
'(:[0-9]{1,4})?'. // 端口- :80
'((\/\?)|'. // 如果含有文件对文件部分进行校验
'(\/[0-9a-zA-Z_!~\*\'\(\)\.;\?:@&=\+\$,%#-\/]*)?)$/',
$url) == 1;
}
/**
* 获取favion图标
* @param $url
* @return bool|mixed
*/
public static function getFavicon($url){
$curl = self::get_url_content($url);
$file = $curl['exec']; //获取到的文件
$zt = $curl['getinfo']; //状态
//有文件,并且返回状态为200
if($file && $zt['http_code'] == '200'){
return true;
}
if (in_array($zt['http_code'],[301,302])) {
// 如果访问ico的时候,发生了重定向,则ico地址为重定向的地址
if (isset($zt['redirect_url'])) {
return $zt['redirect_url'];
}
}
return false;
}
/**
* curl获取数据
* @param $bbb 目标url地址
* @return ['exec'] 获取的内容
* @return ['getinfo'] 返回的状态码
*/
public static function get_url_content($url) {
$ch = curl_init();
$timeout = 5000; //超时时间
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT_MS, $timeout);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt ($ch, CURLOPT_ENCODING, 'gzip'); //取消gzip压缩(代表:网易邮箱)
$file_info['exec']= curl_exec($ch);
$file_info['getinfo'] = curl_getinfo($ch); //判断状态 有的情况下无法正确判断ico是否存在
curl_close($ch);
return $file_info;
}
/**
* 获取网站ICO文件路径
* @param $url
* @return bool|mixed|string
*/
public static function getWebsiteIco($url){
if(empty($url))return '';
if(!self::isUrl($url)){return '';}
// 确定协议
$http = 'http://';
if(substr($url, 0, 5) == 'https') $http = 'https://';
//分解目标域名
$arr = parse_url($url);$domain = $arr['host'];
//尝试根目录是否有ico文件
$check1=self::getFavicon($http.$domain."/favicon.ico");
if($check1 === true) {
return $http.$domain."/favicon.ico";
}
// 发生重定向时,直接返回重定向的目标ico地址
if (strlen($check1) > 10) {
return $check1;
}
$curl = self::get_url_content($url);//尝试读取内容并匹配ico文件
$file = $curl['exec'];
//正则匹配
preg_match('|href\s*=\s*[\"\']([^<>]*?)\.ico[\"\'\?]|i',$file,$a);
if(!empty($a[1])){
$file2=$a[1] .='.ico';
if(!substr($file2,0,4)=='http'){//相对路径
if(substr($file2, 0, 1) == '/'){$file2 = substr($file2, 1);}
if(substr($file2, 0, 3) == '../'){$file2 = substr($a[1], 3);}
if(substr($a[1], 0, 2) == './'){$file2 = substr($file2, 2);}
$file2 = $http.$domain.'/'.$file2;//手动加上链接再试一次
}
$check2=self::getFavicon($file2);
if($check2) {
return $file2;
}
}
return '';
}
}
调用方法:
if (Ico::isUrl($url)) {
$ico = Ico::getWebsiteIco($url);
if (strlen($ico) > 10) {
exit('获取成功','',$ico);
}
exit('获取失败');
} else {
exit('请输入正确的网站链接');
}
推荐文章
[Flutter]MOB推送详细接入教程,闭坑指南
阅读 481
网站安全评估怎么做[自评估]
阅读 197
[设计]常用显示屏屏幕尺寸大全
阅读 483
[设计]手表屏幕尺寸
阅读 516
[设计]平板屏幕尺寸大全
阅读 492
[设计]切图命名规范
阅读 647
[设计]手机屏幕尺寸大全
阅读 471
Flutter MOB配置
阅读 491
[设计]电脑屏幕尺寸大全
阅读 485
[集合]屏幕尺寸大全
阅读 930
[Fastadmin]在前台如何上传文件到七牛云
阅读 599
使用CloudFlare白嫖阿里云香港OSS做图床
阅读 304
[设计]iOS设计尺寸规范
阅读 858
Flutter1.10.3,HTTP Host Availability,checking the HTTP host: Operation timed out
阅读 501
[设计]Android设计尺寸规范
阅读 597
阿里云域名DNS服务器地址大全hichina和alidns
阅读 375
PHP怎么把文件内容转为formfile以传到第三方服务器
阅读 317
在fastadmin中,如何删除七牛云空间的图片
阅读 126
【互联网】好玩的API汇总
阅读 360
windows系统Hosts修改管理工具easyhosts
阅读 6