Magazine Internet

[PHP] Détecter correctement le navigateur et l’OS du client

Publié le 14 juin 2009 par Kphoen

Une simple recherche via notre ami Google le confirmera, il existe une foule de fonctions dédiées à détecter le navigateur utilisé par nos chers utilisateurs. Le hic, c’est que ces fonctions sont souvent codées par - disons ce qui est - de bons gros débutants. Il en résulte donc des informations érronées, très imprécises voire même d’importants ralentissements dans notre script à cause de cette satanée fonction !
Vous ne voyez toujours pas de quel genre de code/fonction je veux parler ? Alors admirez la perle qui suit (trouvée en première page sur google avec la requête « détecter navigateur php ») :

<?
if (eregi('msie', $HTTP_USER_AGENT) & !eregi('opera', $HTTP_USER_AGENT))
{
// Internet Explorer
$navigateur="Internet Explorer";
}
elseif (eregi('opera', $HTTP_USER_AGENT))
{
// Opera
$navigateur="Opera";
}
elseif (eregi('Mozilla/4.', $HTTP_USER_AGENT))
{
// Netscape 4.x
$navigateur="Netscape 4.x";
}
elseif (eregi('Mozilla/5.0', $HTTP_USER_AGENT) & !eregi('Konqueror', $HTTP_USER_AGENT))
{
// Netscape 6
$navigateur="Netscape 6.x";
}
else
{
// Autres navigateurs
$navigateur="Navigateur inconnu";
}
echo $navigateur;
?>

Comme vous pouvez le constater, c’est laid et imprécis à souhait =P

Parant de cette constatation, je me suis mis en quête d’une fonction ou d’une class plus performante, et je suis tombé sur la fonction standard de PHP get_browser(), qui est une vraie bénédiction comparée à notre fonction d’amateur disponible plus haut. Sans plus attendre, voici un bout de code (tiré de PHP.net) montrant son fonctionnement, et surtout les informations renvoyées :

echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

$browser = get_browser(null, true);
print_r($browser);
?>
/*
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3

Array
(
[browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$
[browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9*
[parent] => Firefox 0.9
[platform] => WinXP
[browser] => Firefox
[version] => 0.9
[majorver] => 0
[minorver] => 9
[cssversion] => 2
[frames] => 1
[iframes] => 1
[tables] => 1
[cookies] => 1
[backgroundsounds] =>
[vbscript] =>
[javascript] => 1
[javaapplets] => 1
[activexcontrols] =>
[cdf] =>
[aol] =>
[beta] => 1
[win16] =>
[crawler] =>
[stripper] =>
[wap] =>
[netclr] =>
)
*/

Le seul inconvénient à l’utilisation de cette fonction est qu’elle nécéssite un fichier browscap.ini à jour, fichier qui n’est bien évidemment pas distribué avec PHP =p

Qu’à cela ne tienne, le site distribuant ce fameux browscap.ini met aussi à disposition une classe émulant le fonctionnement de get_browser(), mais étant capable de télécharger elle-même (pour ensuite mettre en cache) le fichier browscap.ini dont elle a tant besoin. La solution ultime à notre problème est donc toute trouvée, et comble du bonheur elle est téléchargeable sur la page Google Code du projet ! =)


Retour à La Une de Logo Paperblog

A propos de l’auteur


Kphoen 5 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossiers Paperblog

Magazine