Как получить 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
Все еще не удается поймать все параметры, но теперь абсолютный путь разрешен. Надеюсь, это поможет.