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 ! =)