Как получить favicon сайта с PHP?

Я хочу получить, запрошенный веб-сайт favicon с PHP. Мне было рекомендовано использовать сервис favicon от Google, но он не работает. Я хочу сделать что-то самостоятельно, но не знаю использования регулярных выражений.

Я нашел класс В Google, который работает в большинстве случаев, но имеет неприемлемую частоту ошибок. Вы можете посмотреть здесь: http://www.controlstyle.com/articles/programming/text/php-favicon/

может кто-нибудь, пожалуйста, помогите мне о получении favicon с помощью регулярное выражение, пожалуйста?

12 ответов


быстрый и грязный:

<?php 
$url = 'http://example.com/';
$doc = new DOMDocument();
$doc->strictErrorChecking = FALSE;
$doc->loadHTML(file_get_contents($url));
$xml = simplexml_import_dom($doc);
$arr = $xml->xpath('//link[@rel="shortcut icon"]');
echo $arr[0]['href'];

использовать S2 service предоставлено google. Это так просто, как это

http://www.google.com/s2/favicons?domain=www.yourdomain.com

соскоб сделать это будет намного проще, чем пытаться сделать это самостоятельно.


по данным Википедия, есть 2 основных метода, которые могут быть использованы веб-сайтами, чтобы иметь favicon, подобранный браузером. Во-первых, как упоминал Стив, значок хранится как favicon.ICO в корневом каталоге веб-сервера. Второй-ссылаться на favicon через тег HTML-ссылки.

чтобы охватить все эти случаи, лучшей идеей было бы проверить наличие фавикона.сначала ICO-файл, и если его нет, найдите либо <link rel="icon" или <link rel="shortcut icon" часть в источнике (ограниченная головным узлом HTML), пока вы не найдете favicon. Это зависит от вас, Хотите ли вы использовать regex или некоторые другой вариант поиска строки (не говоря уже о встроенных в PHP). Наконец,этот вопрос может быть, вам поможет.


похоже http://www.getfavicon.org/?url=domain.com (часто задаваемые вопросы) надежно царапает favicon веб-сайта. Я понимаю, что это сторонний сервис, но я думаю, что это достойная альтернатива сервису Google favicon.


Я делал что-то подобное и я проверил это с кучей URL и все, казалось, работали. URL не обязательно должен быть базовым URL

function getFavicon($url){
    # make the URL simpler
    $elems = parse_url($url);
    $url = $elems['scheme'].'://'.$elems['host'];

    # load site
    $output = file_get_contents($url);

    # look for the shortcut icon inside the loaded page
    $regex_pattern = "/rel=\"shortcut icon\" (?:href=[\'\"]([^\'\"]+)[\'\"])?/";
    preg_match_all($regex_pattern, $output, $matches);

    if(isset($matches[1][0])){
        $favicon = $matches[1][0];

        # check if absolute url or relative path
        $favicon_elems = parse_url($favicon);

        # if relative
        if(!isset($favicon_elems['host'])){
            $favicon = $url . '/' . $favicon;
        }

        return $favicon;
    }

    return false;
}

я реализовал собственный захват favicon, и я подробно описал использование в другом сообщении StackOverflow здесь:получить favicon сайта с JS

спасибо, и дайте мне знать, если это помогает вам. Кроме того, любая обратная связь очень ценится.


Первый метод, в котором мы можем искать его из fevicon.ico если найдено, чем он покажет его еще не

<?php
        $userPath=$_POST["url"];
        $path="http://www.".$userPath."/favicon.ico";
        $header=  get_headers($path);
        if(preg_match("|200|", $header[0]))
        {
            echo '<img src="'.$path.'">';
        }
        else
        {
            echo "<span class=error>Not found</span>";
        }
    ?>

в другом методе вы можете искать значок и получить этот файл значка

    <?php
$website=$_POST["url"];
$fevicon= getFavicon($website);
echo '<img src="http://www.'.$website.'/'.$fevicon.'">';
function getFavicon($site)
{
            $html=file_get_contents("http://www.".$site);
            $dom=new DOMDocument();
            @$dom->loadHTML($html);
            $links=$dom->getElementsByTagName('link');
            $fevicon='';

            for($i=0;$i < $links->length;$i++ )
            {
                $link=$links->item($i);
                if($link->getAttribute('rel')=='icon'||$link->getAttribute('rel')=="Shortcut Icon"||$link->getAttribute('rel')=="shortcut icon")
                {
                    $fevicon=$link->getAttribute('href');
                }
            }
            return  $fevicon;
}
?>

см. этот ответ:https://stackoverflow.com/a/22771267. Это простой в использовании класс PHP, чтобы получить URL-адрес favicon и загрузить его, а также дает вам некоторую информацию о favicon, как тип файла или как был найден favicon (URL по умолчанию,<link> тег...) :

<?php
require 'FaviconDownloader.class.php';
$favicon = new FaviconDownloader('https://code.google.com/p/chromium/issues/detail?id=236848');

if($favicon->icoExists){
    echo "Favicon found : ".$favicon->icoUrl."\n";

    // Saving favicon to file
    $filename = 'favicon-'.time().'.'.$favicon->icoType;
    file_put_contents($filename, $favicon->icoData);
    echo "Saved to ".$filename."\n\n";
} else {
    echo "No favicon for ".$favicon->url."\n\n";
}

$favicon->debug();
/*
FaviconDownloader Object
(
    [url] => https://code.google.com/p/chromium/issues/detail?id=236848
    [pageUrl] => https://code.google.com/p/chromium/issues/detail?id=236848
    [siteUrl] => https://code.google.com/
    [icoUrl] => https://ssl.gstatic.com/codesite/ph/images/phosting.ico
    [icoType] => ico
    [findMethod] => head absolue_full
    [error] => 
    [icoExists] => 1
    [icoMd5] => a6cd47e00e3acbddd2e8a760dfe64cdc
)
*/
?>

Если вы хотите получить favicon с определенного веб-сайта, Вам просто нужно получить favicon.ico от корня сайта. Вот так:

$domain = "www.example.com";
$url = "http://".$domain."/favicon.ico";
$icondata = file_get_contents($url);

... you can now do what you like with the icon data

нашел эту нить... Я написал плагин WordPress, который включает в себя множество вариантов получения favicon. Так как есть много кода GPL:http://plugins.svn.wordpress.org/wp-favicons/trunk/

Он позволяет запускать сервер, который вы можете запросить значки с помощью запросов xml rpc, чтобы любой клиент мог запросить значки. Он имеет структуру плагинов, поэтому вы можете попробовать google, getfavicon и т. д... чтобы узнать, доставляет ли что-нибудь одна из этих служб. Если нет то он переходит в режим извлечения значков с учетом всех статусов http (301/302/404) и лучше всего найти значок в любом месте. После этого он использует функции библиотеки изображений, чтобы проверить внутри файла, действительно ли это изображение и какое изображение (иногда расширение неправильно), и оно подключается, поэтому вы можете добавить после преобразования изображений или дополнительных функций в конвейере.

файл http fetching делает некоторую логику вокруг того, что я вижу выше: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php

но это только часть трубопровода.

может быть довольно сложным как только вы погрузитесь в его.


$url = 'http://thamaraiselvam.strikingly.com/';
$doc = new DOMDocument();
$doc->strictErrorChecking = FALSE;
@$doc->loadHTML(file_get_contents($url));
$xml = simplexml_import_dom($doc);
$arr = $xml->xpath('//link[@rel="shortcut icon"]');
if (!empty($arr[0]['href'])) {
    echo "<img src=".$arr[0]['href'].">";
 }
else 
echo "<img src='".$url."/favicon.ico'>";

Я немного изменился Вивек второй способ и добавил эта функция и выглядит это так:

<?php
        $website=$_GET['u'];
        $fevicon= getFavicon($website);
        echo '<img src="'.path_to_absolute($fevicon,$website).'"></img>';

            function getFavicon($site)
            {
            $html=file_get_contents($site);
            $dom=new DOMDocument();
            @$dom->loadHTML($html);
            $links=$dom->getElementsByTagName('link');
            $fevicon='';

            for($i=0;$i < $links->length;$i++ )
            {
                $link=$links->item($i);
                if($link->getAttribute('rel')=='icon'||$link->getAttribute('rel')=="Shortcut Icon"||$link->getAttribute('rel')=="shortcut icon")
                {
                    $fevicon=$link->getAttribute('href');
                }
            }
            return  $fevicon;
            }

    // transform to absolute path function... 
    function path_to_absolute($rel, $base)
    {
    /* return if already absolute URL */
    if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
    /* queries and anchors */
    if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
    /* parse base URL and convert to local variables:
       $scheme, $host, $path */
    extract(parse_url($base));
    /* remove non-directory element from path */
    $path = preg_replace('#/[^/]*$#', '', $path);
    /* destroy path if relative url points to root */
    if ($rel[0] == '/') $path = '';
    /* dirty absolute URL */
    $abs = "$host$path/$rel";
    /* replace '//' or '/./' or '/foo/../' with '/' */
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
    for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
    /* absolute URL is ready! */
    return $scheme.'://'.$abs;
    }

?>

конечно, вы называете это https://www.domain.tld/favicon/this_script.php?u=http://www.example.com Все еще не удается поймать все параметры, но теперь абсолютный путь разрешен. Надеюсь, это поможет.