Thématiques :
Tags :

Testez le navigateur de vos visiteurs en PHP

Posé ici le vendredi 23 octobre 2009 à 12:11 par Jay Salvat

Testez le navigateur de vos visiteurs en PHP

Même si le besoin se fait bien moins souvent sentir au niveau serveur que client, la détection du navigateur du visiteur peut être nécessaire en Php. J'ai récemment eu ce besoin mais n'ai pas trouvé de solution simple me satisfaisant. J'ai rapidement pondu cette petite classe que je livre en l'état. Elle est largement perfectible. Peut-être en intéressera-t-elle d'autres que moi.

En PHP, la variable de serveur $_SERVER['HTTP_USER_AGENT'] retourne le type de User-Agent utilisé par le visiteur. Pour Firefox sous Windows, le contenu de cette variable rensemble à ceci.

Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1

Une expression régulière permettra d'en tester et extraire les informations utiles.

preg_match(~Firefox/([0-9\.]+)~, $_SERVER['HTTP_USER_AGENT'], $match);

L'expression ~Firefox/([0-9\.]+)~ permet de déceler si le navigateur est Firefox et d'en garder la version.

Array ( 
    [0] => Firefox/3.5.1 
    [1] => 3.5.1 
) 

Chaque navigateur retourne une chaîne différente, il faudra légèrement modifier l'expression selon les cas.

Pour la détection de la plateforme le principe est similaire. On teste si le User-Agent contient la chaîne Windows, Mac, Linux etc...

$position = strpos($_SERVER['HTTP_USER_AGENT'], 'Windows');

Après ces brèves explications voici la classe en question dans son intégralité.

La classe

class Is {
    private function findVersion($regexp) {
        preg_match($regexp, $_SERVER['HTTP_USER_AGENT'], $match);
        return isset($match[1]) ? (float) $match[1] : false;
    }

    private function findPlateform($plateform) {
        return (bool) strpos($_SERVER['HTTP_USER_AGENT'], $plateform);
    }

    static function Firefox() {
        return self::findVersion('~Firefox/([0-9\.]+)~');
    }

    static function IE() {
        return self::findVersion('~MSIE ([0-9\.]+)~');
    }

    static function Safari() {
        return self::findVersion('~Version/([0-9\.]+) Safari~');
    }

    static function Chrome() {
        return self::findVersion('~Chrome/([0-9\.]+)~');
    }

    static function Opera() {
        return self::findVersion('~Opera ([0-9\.]+)~');
    }
   
    static function Windows() {
        return self::findPlateform('Windows');
    } 
    
    static function MacOs() {
        return self::findPlateform('Macintosh');
    }
    
    static function Linux() {
        return self::findPlateform('Linux');
    }
    
    static function Iphone() {
        return self::findPlateform('iPhone');
    }
}

Usage

Voici quelques exemples d'utilisation :

if (Is::Safari()) {
    echo "Excellent choix !";
}
if (!Is::Safari()) {
    echo "Vous devriez utiliser Safari !";
}
if (Is::IE() && Is::IE() < 7) {
    echo "Il est temps de mettre à jour votre navigateur !";
}

Précautions

Le dernier exemple mérite une explication, pourquoi utiliser :

(Is::IE() && Is::IE() < 7)

et pas tout simplement :

(Is::IE() < 7)

Comme je l'explique dans l'article Php et Types de variables : Les pièges à éviter, à vouloir être trop tolérant, Php en devient idiot. Ici, il retourne True même si le visiteur n'utilise pas Internet Explorer, car pour lui False est égale à 0, donc inférieur à 7...

Trackbacks

0 trackback

Commentaires

9 commentaires

Si tu veux une solution simple :
Php.net/manual/…get-browser.php

ou bien encore plus simple (téléchargement automatique de la liste des user agents + mise en cache)

Code.google.com/p/phpbrowscap

que j'utilise

1. Par Vincent Voyer le jeudi 22 octobre 2009 à 14:07

Merci Vincent pour ces compléments d'informations.

Je ne préfère pas utiliser get_browser() car il demande browscap.ini qui pèse 300 ko pour finalement faire le boulot de mes quelques expressions irrégulières. :)

Mais pour des besoins plus pointus, c'est idéal.

2. Par Jay Salvat le jeudi 22 octobre 2009 à 15:01

Attention, sous ubuntu l'agent firefox peut être remplacé par Shiretoko qui n'est autre que la version 3.5 de firefox !!!

3. Par Lo le vendredi 23 octobre 2009 à 16:18

Merci de l'info, Lo.

4. Par Jay Salvat le vendredi 23 octobre 2009 à 16:29

Bonjour je suis tombé sur ta news et je trouve cette class très sympa :)

J'avais déjà créer une fonction permettant de récupéré le navigateur et la version..

Je me suis dit que tu aurais besoin de le liens que j'avais utilisé si tu veux plus poussé sans pour au temps utiliser get_browser() (nombre de navigateur, version... ) : Fr.wikipedia.or…ent#Navigateurs

5. Par Arthur Gerbelot le dimanche 25 octobre 2009 à 14:01

Merci pour le lien Arthur.
Il était déjà dans l'article :)

6. Par Jay Salvat le dimanche 25 octobre 2009 à 15:23

Excuse moi ^^

J'ai voulu être trop rapide en ne lisant que les codes...

7. Par Arthur Gerbelot le dimanche 25 octobre 2009 à 21:37

C'est rigolo, avec ton post je viens de découvrir cet usage du mot self.

J'ai été choqué de voir l'appel d'une méthode privée depuis une méthode statique, et avec un peu de recherches j'en ai pas mal appris ^^

Du coup, merci ;) Grâce à toi je me coucherai moins bête ce soir.

8. Par Alexandre Gaudencio le lundi 26 octobre 2009 à 15:12

Content que ce blog serve à quelque chose alors :)

9. Par Jay Salvat le lundi 26 octobre 2009 à 15:21

Obligatoire. Vrai nom apprécié.

Il ne sera ni affiché, ni spammé.

Votre blog ou votre site web.

Constructif, courtois et correctement écrit. SMS proscrit. Merci.