我有一个动态填充的链接列表,我希望每个链接旁边都显示其favicon。感谢其他一些人,我稍微接近这个工作,但我仍然遇到的问题是,因为下面的代码正在提取与搜索匹配的任何内容,在某些情况下它会获得相对路径最喜欢的图标,在其他情况下,正如我一直在心里发现的那样,它会得到一些完全随机的东西,就像一个完全弄乱我的页面的脚本,并通过我的错误日志发送给我一个疯狂的追逐
所以我的问题是:如何获得favicon的绝对路径,如果我可以修改下面的代码来做到这一点,那么我怎样才能验证它在搜索中发现的是什么呢一个图像?
搜索favicon链接的功能:
// Get favicon of link
function get_favicon($url) {
$doc = new DOMDocument();
$doc->strictErrorChecking = FALSE;
$doc->loadHTML(file_get_contents($url));
$xml = simplexml_import_dom($doc);
$arr = $xml->xpath('//link[@rel="shortcut icon"]');
$favicon = $arr[0]['href'];
return $favicon;
}
显示页面中的代码,它从foreach循环中的数组中提取URL:
$ll_favicon = get_favicon(esc_attr( $ll_entry['ll_url'] ));
echo '<img src="'.$ll_favicon.'" />';
感谢您的帮助!
更新
好悲伤,这太疯狂了。我整天都在研究这个问题但仍然没有运气。
目前它的工作时间(但需要永远加载)恰好有50%的时间。是的,50%。它将在一段时间后加载并完美地工作,然后我将刷新页面而不会改变任何一件事并且它会再次中断(页面仅加载到同一链接),然后我将刷新并且它会工作,然后再次刷新它不会,现在我非常沮丧,我放弃了。它总是在同一个链接之前中断:http://www.santafenewmexican.com/pasatiempo/
只是那个链接。我甚至尝试过这样做,无论我把它放在哪里,它都会破坏页面,但是对于任何其他网址都可以正常工作:
<?php echo get_favicon('http://www.santafenewmexican.com/pasatiempo/'); ?>
这是我最终的功能。如果有人想知道他们是否可以使这项工作,请务必使用:
// Get favicon of link
function get_favicon($url) {
$doc = new DOMDocument();
$doc->strictErrorChecking = FALSE;
$doc->loadHTML(file_get_contents($url));
$xml = simplexml_import_dom($doc);
$arr = $xml->xpath('//link[@rel="shortcut icon"]');
$favicon = $arr[0]['href'];
if( !empty($favicon) ) {
// Verify that the URL is the absolute path:
if(strpos($favicon,'http') !== 0 && strpos($favicon,'//') !== 0 && strpos($favicon,'://') !== 0)
$favicon = rtrim($url,'/') . $favicon;
// Verify that the file found actually exists and if so, whether it's an image:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$favicon);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch)!==FALSE)
{
if(function_exists('finfo_fopen')) {
// for PHP 4:
$fhandle = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($fhandle,$favicon);
// for PHP 5:
$file_info = new finfo(FILEINFO_MIME);
$mime_type = $file_info->buffer(file_get_contents($favicon));
switch($mime_type) {
case ('image/x-icon'||'image/icon'||'image/vnd.microsoft.icon'||'image/gif'||'image/jpeg'||'image/png'||'image/vnd.sealed-png'||'image/vnd.sealedmedia.softseal-gif'||'image/vnd.sealedmedia.softseal-jpg'):
return $favicon;
}
} elseif(function_exists('exif_imagetype')) {
if (exif_imagetype($favicon) != (IMAGETYPE_GIF || IMAGETYPE_JPEG || IMAGETYPE_PNG || IMAGETYPE_ICO)) {
return 'No, exif_imagetype did not return a valid mime.';
} else {
return $favicon;
}
} elseif(function_exists('getimagesize')) {
$imginfo_array = getimagesize($favicon);
if ($imginfo_array !== false) {
$mime_type = $imginfo_array['mime'];
switch($mime_type) {
case ('image/x-icon'||'image/icon'||'image/vnd.microsoft.icon'||'image/gif'||'image/jpeg'||'image/png'||'image/vnd.sealed-png'||'image/vnd.sealedmedia.softseal-gif'||'image/vnd.sealedmedia.softseal-jpg'):
return $favicon;
}
} else {
return 'No, getimagesize did not return a valid mime.';
}
}
} else {
return 'This file does not exist!';
}
} else {
return 'No favicon was found.';
}
}
答案 0 :(得分:1)
您应该检查href
并查看它是否绝对。
这是一个例子
$favicon = $arr[0]['href'];
if(strpos($favicon,'http') !== 0 && strpos($favicon,'//') !== 0 && strpos($favicon,'://') !== 0)
$favicon = rtrim($url,'/') . '/' . $favicon;
return $favicon;