先週末からのデータぶっ飛び騒ぎでいまだガサゴソやっている今日だったりするのだが、ふと”favicon.ico”あのGoogleとかアメブロとかのアイコンマーク。
あれがどこに配置されているんだろうと気になったので、力業で探すスクリプトを書いてみた。

なにかのライブラリに組み込もうかと思ったけれど、単体でひとまず完成してしまったので恥ずかしながら公開してみよう。

<?php
// サンプル用のURL(さくらインターネット研究所)
$url = 'http://research.sakura.ad.jp/';
function favicon_search($url) {
    try {
        if (! ($fp = fopen ( $url, "r" ))) {
            // echo "file can't open.";
            throw new Exception ( FALSE );
        }
        for($i = 0; $i < 30; $i ++) {
            if (! ($line = fgets ( $fp ))) {
                // echo "file all read.";
                throw new Exception ( FALSE );
            }
            if (preg_match ( '/shortcut\sicon/s', $line, $temp )) {
                if (preg_match ( '/href="([0-9a-z!-~]*\.ico)"/', $line, $temp2 )) {
                    if (! preg_match ( '/^http:\/\//', $temp2 [1] )) {
                        $parse_url = parse_url ( $url );
                        if (strncmp ( $temp2 [1], "/", 1 ) == 0) {
                            $icon = '//' . $parse_url ['host'] . $temp2 [1];
                        } else {
                            $icon = '//' . $parse_url ['host'] . $parse_url ['path'] . $temp2 [1];
                        }
                        throw new Exception ( $icon );
                    }
                    // echo "where exist favicon.ico.<br/>\n";
                    throw new Exception ( $temp2 [1] );
                    break;
                }
            }
        }
        fclose ( $fp );
        return FALSE;
    } catch ( Exception $e ) {
        fclose ( $fp );
        return $e->getMessage ();
    }
}
// 実行部分
header ( "Content-type:text/html;charset=utf-8" );
if (FALSE == favicon_search ( $url )) {
    echo "FALSE<br>\n";
} else {
    echo favicon_search ( $url ) . "<br/>\n";
}

とにかく、どこかで変なことが起こったら例外に全部飛ばそうというコンセプトで書いてみた。
主な処理としては、HTMLを1行ずつ読み込んで”shortcut icon”が記述してある行が見つかったら、その行からhref要素を抜き出す処理である。
正規表現を2回も使っているのは単に他に処理が思いつかなかっただけ。
本当なら1回で書き切れてもいいのだと思うのだけど、今日は放置。

あと、今回はfor文を使っている部分があるが、単に無限ループにはまるとめんどくさいという理由で、for文を使用。本当ならwhile(1){}でやってもいいかとは思うのだけど。

しかし、いつも思うのだがサイト毎に書き方まちまち。対応するのに一苦労だ。

地味にUSBも足りないと思う今日この頃。↓こういうのがあれば捗るな。
なんでそう思ったかは次回、閑話休題LinkStationを復旧するをみればわかるかも。