2009-08-14 10 views
7

Na danym terenie „example.domain.tld” lub po prostu „domena.tld” Muszę wykonać następujące czynności w PHP:PHP - uzyskanie favicon witryny i przekształcenie go do png razie potrzeby

  • Jeśli witryna posiada favicon, dostać go wszędzie tam, gdzie jest
    • Jeśli nie jest już PNG, przekonwertować go do PNG
    • zapisać go do /favicons/example.domain.tld.png
  • Jeśli strona nie ma favicon, nic nie rób.

Wszelkie pomysły? Jestem zaskoczony przez niewiarygodny format pliku i lokalizację faviconów, ale jeśli w ogóle to możliwe, chcę uniknąć pobierania całego źródła strony z file_get_contents, aby znaleźć je w nagłówkach. Również konwersja do png wydaje się nietrywialna.

Dzięki,

Mala

Odpowiedz

26

Co jest typowe, znalazłem na zadowalający rozwiązanie krótko po zadać pytanie - niech google do pracy dla Ciebie:

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

zwraca 16x16 png

+0

, który jest jak pisanie siebie: www.domain.com/favicon.ico. Sprawdziłem i to jest to samo .. – vsync

+5

Niezupełnie - po pierwsze zwraca png, a nie ico. Po drugie, favicony mogą znajdować się w niezliczonej ilości ścieżek - to je standaryzuje i zostawia pracę Google. Wreszcie, jeśli favicon nie zostanie znaleziony, zwraca obraz zastępczy zamiast lądowania z uszkodzonym obrazem. – Mala

+3

Ale tak jak w przypadku wszystkich centralnych rozwiązań: pamiętaj, że Google może teraz połączyć Cię z tą garstką adresów URL. Jeśli ci to nie przeszkadza, to wygląda dobrze. –

0

Jeśli favicon nie znajduje się na /favicon.ico Chyba trzeba przeanalizować HTML.

Do wykrywania typów plików można użyć funkcji this extension, która wykrywa typ pliku przy użyciu magicznych bajtów.

Możesz przekonwertować na PNG przy użyciu biblioteki GD, przykład można znaleźć here.

0

Zakrywanie do formatu PNG nie jest takie trudne.

Nie otrzymuję pytania w całości, czy jest to ulubiona ikona w Twojej witrynie lub na innych stronach? Jeśli na innych stronach, będziesz musiał przeanalizować pobrany HTML, a następnie załadować favicon.

+0

Moja witryna musi przyjąć dowolny adres URL (powiedzmy, http://www.amazon.com), a następnie dostać favicon witryny - w tej chwili używam file_get_contents ($ site/favicon.ico) , ale problem polega na tym, że niektóre witryny lubią inne ikony formatów lub przechowują je w innych miejscach. Zastanawiam się, czy istnieje ogólny sposób dotarcia do favicon – Mala

0

Jeśli twoja instalacja PHP zawiera bibliotekę GD, możesz przekonwertować obraz do PNG za pomocą funkcji imagepng.

4

Znalazłem to: http://www.controlstyle.com/articles/programming/text/php-favicon/

Mam zamiar wypróbować to dla mojego projektu, a ja zgłoś się i powiem, czy to działa!

Cheers

Iain

+0

To faktycznie działa! Ale do tej pory nie wydaje się, aby sprytnie analizować favicons w niestandardowych lokalizacjach. Skopię się i opublikuję źródło, jeśli wymyślę jakieś rozwiązanie. -Nasz –

+0

Oopsy! Okazuje się, że po prostu źle to zrobiłem. Klasa jest w porządku! –

+0

Ta klasa nie działa dobrze w nowych wersjach php. – Maelish

2

Jak powiedział Iain Fraser, klasa Favicon z controlstyle.com nie działa ze wszystkimi przypadku testowego.

Zasadniczo, jeśli pod warunkiem, ikona tag <link> skrót mogą zawierać różne rodzaje URL:

  • pełny absolutny URL: http://www.domain.com/images/fav.ico
  • absolutny URL ze względnym schematem: //www.domain.com/images/fav.ico
  • ścieżka bezwzględna: /images/fav.ico
  • względny adres URL: ../images/fav.ico

Ponadto, strona internetowa może zawierać atrybut <base href="..." /> które zmienia jak radzić sobie z względny adres URL i absoute ścieżce ...

Więc pisałem klasa PHP, który działa z każdym z tych przypadków. Po pierwsze, próbuje uzyskać adres URL favicon z atrybutu <link> i przywrócić domyślny identyfikator URI favicon (//www.domena.com/favicon.ico) w przypadku niepowodzenia.

Możesz go pobrać na mojej stronie tutaj: http://www.finalclap.com/faq/477-php-favicon-find-download lub zainstalować za pomocą kompozytora: composer require vincepare/favicon-downloader.

Jak używać:

<?php 
require 'FaviconDownloader.class.php'; 
$favicon = new FaviconDownloader('http://stackoverflow.com/questions/19503326/bug-with-chrome-tabs-create-in-a-loop'); 

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"; 
} 
?> 
+0

Dobra klasa. Tylko uwaga: twój skrypt finalclap.com ma wiele błędów związanych z odstępami, które są trudne do znalezienia i złamać kod. Raz naprawiony, działa świetnie. Przyszłe plany zamiany .ico na .png? –

+0

Wiem, że ten problem z odstępami jest spowodowany przez http://alexgorbatchev.com/SyntaxHighlighter/, używany do wyświetlania kodu w mojej witrynie. Powinieneś raczej pobrać klasę stąd: http://www.finalclap.com/download/item/76-favicondownloader-php-class zamiast skopiować i wkleić kod źródłowy ze strony samouczka. Nie planuję dodawać funkcji konwersji obrazów, ponieważ uważam, że istnieją lepsze narzędzia do osiągnięcia tego celu, takie jak imagemagick. – Vince

Powiązane problemy