Как определить значок (ярлык) для любого сайта через php? - PullRequest
4 голосов
/ 26 апреля 2011

как определить значок (ярлык) для любого сайта через php?

Я не могу написать регулярное выражение, потому что отличается на сайтах ..

Ответы [ 3 ]

14 голосов
/ 26 апреля 2011

Вы можете использовать этот адрес и поместить его в регулярное выражение

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

Это решает проблему, с которой вы столкнулись при использовании Regexp, и различные результаты для каждого домена

1 голос
/ 24 мая 2012
$address = 'http://www.youtube.com/'
$domain = parse_url($address, PHP_URL_HOST);

или из базы данных

$domain = parse_url($row['address_column'], PHP_URL_HOST);

дисплей с

<image src="http://www.google.com/s2/favicons?domain='.$domain.'" />
1 голос
/ 26 апреля 2011

Вы можете запросить http://domain.com/favicon.ico с помощью PHP и посмотреть, получите ли вы 404.

Если вы получите 404, вы можете передать DOM веб-сайта, ища другое местоположение, как указано в head элемент с элементом link с rel="icon".

// Helper function to see if a url returns `200 OK`.
function $resourceExists($url) {
    $headers = get_headers($request);
    if ( ! $headers) {
        return FALSE;
    }
    return (strpos($headers[0], '200') !== FALSE);
}

function domainHasFavicon($domain) {
    // In case they pass 'http://example.com/'.
    $request = rtrim($domain, '/') . '/favicon.ico';

    // Check if the favicon.ico is where it usually is.
    if (resourceExists($request)) {        
        return TRUE;
    } else {
       // If not, we'll parse the DOM and find it  
       $dom = new DOMDocument;
       $dom->loadHTML($domain);
       // Get all `link` elements that are children of `head`
       $linkElements = $dom
                       ->getElementsByTagName('head')
                       ->item(0)
                       ->getElementsByTagName('link');

       foreach($linkElements as $element) {
           if ( ! $element->hasAttribute('rel')) {
               continue;
           }
           // Split the rel up on whitespace separated because it can have `shortcut icon`.
           $rel = preg_split('/\s+/', $element->getAttribute('rel'));

           if (in_array('link', $rel)) {
               $href = $element->getAttribute('href');

               // This may be a relative URL.
               // Let's assume http, port 80 and Apache
               $url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

               if (substr($href, 0, strlen($url)) !== $url) {
                   $href = $url . $href;
               }

               return resourceExists($href);
       }
    }
    return FALSE;
}

Если вы хотите, чтобы URL был возвращен в favicon.ico, модифицировать вышеуказанную функцию тривиально.

...