今日、とても泥臭いソースを書きましたのでご報告申し上げます。
urlからfaviconのurlを取る。
% cat favicon.php
<?php
require_once 'PHP/Compat/Function/file_get_contents.php';
require_once 'XML/XML_HTMLSax.php';
function getFavicon($url)
{
class FaviconHandler
{
var $favicon;
function openHandler(&$parser, $name, $attrs)
{
if ($name 'link' and $attrs['rel'] ‘shortcut icon’) {
$this->favicon = $attrs[‘href’];
}
}
function closeHandler(&$parser, $data) {}
}
$handler = new FaviconHandler();
$parser =& new XML_HTMLSax();
$parser->set_object($handler);
$parser->set_element_handler(‘openHandler’, ‘closeHandler’);
$doc = file_get_contents($url);
$parser->parse($doc);
$favicon = $handler->favicon;
if (!$favicon) {
if ($url{strlen($url)-1} != ’/’) {
$url .= ’/’;
}
$favicon = $url . ‘favicon.ico’;
}
return $favicon;
}
echo getFavicon(‘http://del.icio.us/komagata’)
?>
% php favicon.php
http://del.icio.us/favicon.ico
ヘッダに書いてない場合は何故か無理矢理URLにfavicon.icoをくっ付けて返す。 誰かJavaScript版ください。さもないとまたおれが泥臭いの書くぞ!faviconの決めつけは良くないということで一応、あるかどうか探すように変更した。
$favicon = $link . 'favicon.ico';
if (!@file_get_contents($favicon)) {
$favicon = false;
}
file_get_contents()はやっぱりイイ!ネット上のファイルの存在確認もわかる!(404だとfalse返ってくるみたい)