获取favicon的绝对路径并验证它是图像

时间:2016-01-10 21:31:57

标签: php

我有一个动态填充的链接列表,我希望每个链接旁边都显示其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.';
    }
}

1 个答案:

答案 0 :(得分:1)

您应该检查href并查看它是否绝对。

这是一个例子

$favicon = $arr[0]['href'];
if(strpos($favicon,'http') !== 0  && strpos($favicon,'//') !== 0 && strpos($favicon,'://') !== 0)
    $favicon = rtrim($url,'/') . '/' . $favicon;
return $favicon;