PHP – Favilink – Afficher le favicon d’un site avec son lien

Au détour de mes veilles php, à la recherche des nouveautés et petites astuces, je suis tombé sur un petit script sympathique qui permet de récupérer le favicon d’un site et ainsi de réaliser une petite liste de liens externes avec le favicon associé au site en question. Un petit script malin que j’ai envie de vous faire partager à mon tour. Je l’ai légèrement ré-agencé à ma sauce et très peu modifié au final.

favilink

Voici la fonction favilink :

<?php
/**
* Favilink
*
* Affiche un lien précédé du favicon
* du site internet de destination.
*
* @author PHPLizardo
* @version 1
* @license CC BY-NC-SA
*
* @param string $url url à laquelle vous souhaitez ajouter le favicon.
* @param string $text Si vous souhaitez un texte personnalisé pour lien.
* @param string $alt favicon alternative dans le cas ou le site internet
concerné n'en possède pas.
*
*/

function favilink($url, $text = NULL, $alt = NULL){

	/**
	* Si un texte pour le lien est fourni, on utilise ce dernier,
	* dans le cas contraire, on affiche l'url donnée.
	*/

	if($text != NULL)
		$text = $text;
	else
		$text = $url;

	/**
	* La valeur du paramètre $url doit impérativement
	* être un url valide. On vérifie cette condition.
	*/

	$url = filter_var ($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED);

	if ($url !== FALSE){

		/**
		* Nous devons extraire le nom de domain de l'url
		* passée en paramètre. On découpe l'url en portions.
		*/

		$parts = parse_url($url);

		/**
		* Récupération du nom de domaine par recomposition de
		* l'url précédemment découpée.
		*/

		$domain = $parts['scheme'].'://'.$parts['host'];

		/**
		* Récupération du favicon. On recherche le favicon dans le répertoire
		* racine du site internet car c'est l'endroit le plus répendu. Si, et
		* seulement si le fichier n'existe pas, on télécharge la page distante
		* et on extrait l'adresse du favicon depuis l'en-tête de la page.
		*/

		$favicon = $domain.'/favicon.ico';

		//if ( !file_get_contents ( $favicon ) ){
		if (!@file_get_contents($favicon)){

			$page = file_get_contents ( $domain );

			if (preg_match('##', $page, $match ) ){

				$favicon = $match[3];

			}else{

				/**
				* Si il n'y a aucun favicon défini pour ce site internet, dans le cas ou une
				* image alternative est fourni, on affiche cette dernière, sinon on affiche rien.
				*/
				if($alt != null)
				$favicon = $alt;
				else
				return '<a href="'.htmlspecialchars ( $url ).'">'.htmlspecialchars($text).'</a>';

			}

			/**
			* Si c'est une adresse abosulue, par exemple dans le cas où le favicon
			* est situé sur un site internet externe ou un sous-domaine, on récupère
			* l'adresse entière. Sinon on combine le nom de domaine et l'adresse relative
			* du favicon pour recréer une adresse valide.
			*/

			if( filter_var ( $favicon, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED ) === FALSE ){

				/**
				* On retire l'éventuel slash (/) qui se situe au début de l'adresse
				* relative pour éviter le double slash.
				*/

				if ( $favicon{1} == '/' )
				$favicon = substr ( $favicon, 1 );

				$favicon = $domain . $favicon;

			}

		}

		return '<img title=" '.htmlspecialchars($domain).' " src="'.htmlspecialchars($favicon).'" alt="" /> '.'<a href="'.htmlspecialchars($url).'">'.htmlspecialchars($text).'</a>';

	}

}

[/cc]

Pour l’utiliser, voici un exemple :

<?php 

echo favilink ( 'https://blog.ludikreation.com', 'Le blog de LudiKreation').'<br />';
echo favilink ( 'http://www.ludikreation.com', 'Le site de LudiKreation');

?>

 

 

Ce qui donne :
favilink

Vous l’aurez compris, avec quelques petites modifications de styles CSS et on peut obtenir des résultats assez sympa.

Pour retrouver la source du code proposé par PHPLizardo sur PHP Sources

Articles pouvant vous intéresser :

Author: Franck Pertegas

Share This Post On

Trackbacks/Pingbacks

  1. PHP – Convertir une couleur Hexadécimale en code couleur RGB | LudiBlog - [...] PHP – Favilink – Afficher le favicon d’un site avec son lien [...]

Submit a Comment

Votre adresse e-mail ne sera pas publiée.