1

Linked IN

No link...Use default location.
http://www.linkedin.com/favicon.ico

ツイッター

  <link href="/phoenix/favicon.ico" rel="shortcut icon" type="image/x-icon" />

Pinterest

<link rel="icon" href="http://passets-cdn.pinterest.com/images/favicon.png" type="image/x-icon" />

フェイスブック

<link rel="shortcut icon" href="https://s-static.ak.facebook.com/rsrc.php/yi/r/q9U99v3_saj.ico" />

ファビコンを見つける唯一の100%の方法は、ソースをチェックしてリンクがどこにあるかを確認することであると判断しました。

  • デフォルトの場所が常に使用されるとは限りません。最初の2つの例に注意してください。
  • Google APIは約85%の時間しか機能しません。 やってみよう

この情報を解析できる関数はありますか?または、正規表現を使用して手動で引き出すための優れた戦略はありますか。

この情報を取得するために、htmlサーバー側を解析します。

アイデア:

正規表現の例:ここで試してください。簡単そうに見えます...しかし、ここが出発点です。

<link\srel="[Ss]hortcut [Ii]con"\shref="(.+)"(.+)>
4

3 に答える 3

3

パーサーを使用します。

$dom = new DOMDocument();
@$dom->loadHTML($input);
$links = $dom->getElementsByTagName('link');
$l = $links->length;
$favicon = "/favicon.ico";
for( $i=0; $i<$l; $i++) {
    $item = $links->item($i);
    if( strcasecmp($item->getAttribute("rel"),"shortcut icon") === 0) {
        $favicon = $item->getAttribute("href");
        break;
    }
}
// You now have your $favicon
于 2012-05-23T18:01:42.400 に答える
0

サイトのリダイレクトやさまざまな警告など、いくつかの問題を回避する必要があります。私のウェブサイトの 90% がファビコンをフィードするようなものを収集するために私がしたことは次のとおりです。

<?
/*
  nws-favicon : Get site's favicon using various strategies

  This script is part of NWS
  https://github.com/xaccrocheur/nws/

*/


function CheckImageExists($imgUrl) {
    if (@GetImageSize($imgUrl)) {
        return true;
    } else {
        return false;
    };
};

function getFavicon ($url) {

$fallback_favicon = "/var/www/favicon.ico";

    $dom = new DOMDocument();
    @$dom->loadHTML($url);
    $links = $dom->getElementsByTagName('link');
    $l = $links->length;
    $favicon = "/favicon.ico";
    for( $i=0; $i<$l; $i++) {
        $item = $links->item($i);
        if( strcasecmp($item->getAttribute("rel"),"shortcut icon") === 0) {
            $favicon = $item->getAttribute("href");
            break;
        }
    }

    $u = parse_url($url);

    $subs = explode( '.', $u['host']);
    $domain = $subs[count($subs) -2].'.'.$subs[count($subs) -1];

    $file = "http://".$domain."/favicon.ico";
    $file_headers = @get_headers($file);

    if($file_headers[0] == 'HTTP/1.1 404 Not Found' || $file_headers[0] == 'HTTP/1.1 404 NOT FOUND' || $file_headers[0] == 'HTTP/1.1 301 Moved Permanently') {

        $fileContent = @file_get_contents("http://".$domain);

        $dom = @DOMDocument::loadHTML($fileContent);
        $xpath = new DOMXpath($dom);

        $elements = $xpath->query("head/link//@href");

        $hrefs = array();

        foreach ($elements as $link) {
            $hrefs[] = $link->value;
        }

        $found_favicon = array();
        foreach ( $hrefs as $key => $value ) {
            if( substr_count($value, 'favicon.ico') > 0 ) {
                $found_favicon[] = $value;
                $icon_key = $key;
            }
        }

        $found_http = array();
        foreach ( $found_favicon as $key => $value ) {
            if( substr_count($value, 'http') > 0 ) {
                $found_http[] = $value;
                $favicon = $hrefs[$icon_key];
                $method = "xpath";
            } else {
                $favicon = $domain.$hrefs[$icon_key];
                if (substr($favicon, 0, 4) != 'http') {
                    $favicon = 'http://' . $favicon;
                    $method = "xpath+http";
                }
            }
        }

        if (isset($favicon)) {
            if (!CheckImageExists($favicon)) {
                $favicon = $fallback_favicon;
                $method = "fallback";
            }
        } else {
            $favicon = $fallback_favicon;
            $method = "fallback";
        }

    } else {
        $favicon = $file;
        $method = "classic";

        if (!CheckImageExists($file)) {
            $favicon = $fallback_favicon;
            $method = "fallback";
        }

    }
    return $favicon;
}

?>
于 2013-09-11T18:25:55.227 に答える
0

PHP 5 DOMDocument の代替: 生の正規表現

これは、これまでのところすべてのケースで機能します。

    $pattern = '#<link\s+(?=[^>]*rel="(?:shortcut\s)?icon"\s+)(?:[^>]*href="(.+?)").*>#i';      
于 2012-05-23T18:07:23.063 に答える