Pokemon_JOJO

Le Blog du Pokemon !

“Et non ce n'est pas un blog sur les pokemons! Ici, vous trouverez des articles sur la programmation (JavaScript, CSS, et PHP), ainsi que d'autres choses plus ou moins utiles souvent en rapport avec Linux... ou pas”
04
juil

Détecter le navigateur utilisé avec $_SERVER['HTTP_USER_AGENT'] en PHP

Publi dans PHP, ajouter un commentaire, ou faire un trackback.

Ayant besoin de définir des accès spécifiques à un back office en fonction du navigateur client utilisé (ex. pour ne pas autoriser IE). Ne voulant pas utiliser get_browser() (qui nécessite browscap.ini). J’ai créé une fonction PHP qui vous permet de détecter le navigateur utilisé, la version et le système d’exploitation d’un internaute en utilisant la variable $_SERVER['HTTP_USER_AGENT'].

function get_browser_agent()

/**
 * Permet de détecté le navigateur client utilisé
 * 
 * @info http://www.mibhouse.org/pokemon_jojo/
 * 
 * @param string $return Valeur de retour demandée
 *
 * @return string|array
 */
function get_browser_agent($return = false) {
	global $browser_agent;
 
	if($return)
		$return = strtolower($return);
 
	// Navigateurs connu
	if($return && $return == 'browsers') {
		return array(
			'firefox'	=> 'browser',
			'shiretoko'	=> 'browser', // nom de code de firefox 3.5 dev
			'msie'		=> 'browser',
			'opera'		=> 'browser',
			'chrome'	=> 'browser',
			'safari'	=> 'browser',
			'mozilla'	=> 'browser',
			'seamonkey'	=> 'browser',
			'konqueror'	=> 'browser',
			'netscape'	=> 'browser',
			'gecko'		=> 'browser',
			'navigator'	=> 'browser',
			'mosaic'	=> 'browser',
			'lynx'		=> 'browser',
			'amaya'		=> 'browser',
			'omniweb'	=> 'browser',
			'avant'		=> 'browser',
			'camino'	=> 'browser',
			'flock'		=> 'browser',
			'aol'		=> 'browser',
 
			'googlebot'	=> 'spider',
			'msnbot'	=> 'spider',
			'yahoo'		=> 'spider',
			'ask'		=> 'spider',
 
			'itunes'	=> 'other',
		);
	}
	// Plateforme connue
	else if($return && $return == 'platforms') {
		return array(
			'android'	=> array('android'),
			'freebsd'	=> array('freebsd'),
			'linux'		=> array('linux'),
			'iphone'	=> array('iphone'),
			'zune'		=> array('zune'),
			'mac'		=> array('macintosh', 'mac platform x', 'mac os x'),
			'win'		=> array('windows', 'win32'),
		);
	}
 
	if(!isset($browser_agent)) {
		$browser_agent = array(
			'name'		=> false,
			'version'	=> 0,
			'platform'	=> false,
			'userAgent' 	=> $_SERVER['HTTP_USER_AGENT'] 
		);
 
		// Navigateur + Version
		foreach(get_browser_agent('browsers') as $browser => $type) {
			if (preg_match("#($browser)[/ ]?([0-9.]*)#", strtolower($browser_agent['userAgent']), $match)) {
				$browser_agent['name'] = $match[1];
				// Hack safari
				if($browser_agent['name'] == 'safari' && preg_match("#version[/ ]?([0-9.]*)#", strtolower($browser_agent['userAgent']), $match)) {
					$browser_agent['version'] = $match[1];
				}
				else
					$browser_agent['version'] = $match[2];
 
				if($type == 'spider')
					$browser_agent['platform'] = $type;
 
				break;
			}
		}
 
		// OS
		if(!$browser_agent['platform']) {
			foreach(get_browser_agent('platforms') as $platform => $values) {
				if(!$browser_agent['platform']) {
					foreach($values as $value) {
						if (strpos(strtolower($browser_agent['userAgent']), $value)) {
							$browser_agent['platform'] = $platform;
							break;
						}
					}
				}
				else
					break;
			}
		}
	}
 
	if($return && isset($browser_agent[$return]))
		return $browser_agent[$return];
	else if(!$return)
		return $browser_agent;
	else
		return false;
}

Exemples d’utilisations

Exemple 1 : informations du navigateur

<?php
$browser = get_browser_agent();
print_r($browser);
?>

L’exemple ci-dessus va afficher quelque chose de similaire à :

Array
(
    [name] => opera
    [version] => 9.64
    [platform] => linux
    [userAgent] => Opera/9.64 (X11; Linux i686; U; fr) Presto/2.1.1
)

Exemple 2 : nom du navigateur

<?php
$browser_name = get_browser_agent('name');
print_r($browser_name);
?>

L’exemple ci-dessus va afficher quelque chose de similaire à :

opera

Exemple 3 : autoriser des navigateurs en tenant compte de leurs versions

Il peut être utile de connaitre le navigateur utilisé et sa version pour par exemple autorisé l’accès à une application web uniquement aux navigateurs compatibles.

<?php
// Detection du navigateur
$browser = get_browser_agent();
 
// Navigateurs autorisés (avec la version minimum requise)
$browser_allowed = array(
	'shiretoko'		=> '3.5',
	'firefox'		=> '3.0',
	'opera'		=> '9.0',
);
 
// Le navigateur est t'il autorisé?
if(array_key_exists($browser['name'], $browser_allowed) && version_compare($browser['version'], $browser_allowed[$browser['name']], '>='))
	$autorized = true; 
else
	$autorized = false; 
 
print_r($browser);
 
if($autorized)
	echo 'Votre navigateur est compatible. Vous êtes autorisé à accéder à l\'application.';
else
	echo 'Votre navigateur n\'est pas compatible. Vous n\'êtes pas autorisé à accéder à l\'application.';
?>

L’exemple ci-dessus va afficher quelque chose de similaire à :

Array
(
    [name] => opera
    [version] => 9.64
    [platform] => linux
    [userAgent] => Opera/9.64 (X11; Linux i686; U; fr) Presto/2.1.1
)
Votre navigateur est compatible. Vous êtes autorisé à accéder à l'application.

Remarques et utilisations

Vous êtes bien entendu autorisé à utiliser cette fonction dans vos propres scripts. Si tel est le cas, n’hésitez pas à me laisser un petit message, ça fait toujours plaisir ;) . Évidemment vos commentaires, suggestions et améliorations sont toujours les bienvenues.

12 commentaires sur “Détecter le navigateur utilisé avec $_SERVER['HTTP_USER_AGENT'] en PHP”

  1. frédéric dit :

    Bonjour,

    je suis donc Frédéric. Je suis en train de travailler sur un projet de site. Mais n’en étant qu’au début du concept, je n’ai encore rien en ligne : pour l’heure, je couche sur le papier le design de mes pages, mes besoins de codes, la structure de la navigation etc etc…
    Pour autant, je travaille en php (4), donc je teste certains codes dans Dreamweaver : aussi bien les miens propres que d’autres qui « m’échappent », car je ne suis à la base que webdesigner, formé au php sur les niveaux 1 et 2, mais pas au-delà.

    Je me suis donc intéressé à votre fantastique code. Sachez que je suis admiratif. Un code propre, compréhensible et surtout, l’essentiel, qui fonctionne sans coup férir : une merveille d’utilisation et de fonctionnement. Bref, bravo.

    Cela étant, je vous écris parce que, néanmoins, j’ai un tout petit souci :
    Afficher le résultat des détections dans sa page php est donc aisé grâce au print_r de la variable $browser de votre exemple 1.
    Mais puisqu’il faut en passer par là, donc privé d’une déclaration de variable personnelle qui serait égal au print_r, forcé donc de marquer le code entier d’affichage (get_browser_agent etc..) comment faire pour inscrire le résultat de la détection dans un echo php formatant le corps d’un mail ?
    Mon problème est simple : on remplira un formulaire, qui si correctement renseigné et donc envoyé, enverra automatiquement à l’internaute un mail avec un fichier lié. On remplira le formulaire pour justement recevoir le fichier lié par ce mail automatique. Par souci de sécurité, un récapitulatif des infos entrées dans le formulaire sera marqué dans le mail : nom prénom, etc + même le numéro IP. Or je voudrais justement faire avec votre code ce que j’ai fait avec le n° IP : $ip = $_SERVER["REMOTE_ADDR"]; – ce qui me permet de marquer dans le mail formaté entièrement par un echo php : votre numero ip est $ip.

    Comment faire donc avec votre code pour parvenir à cette simplification pour le corps du mail ?

    En espérant ne pas vous avoir dérangé ni fait trop long et encore moins confus, en vous félicitant encore pour votre code, j’espère avoir de vos nouvelles. Cordialement,
    Frédéric

  2. frédéric dit :

    Rebonjour,

    je me réponds : svariable = $print_r($browser, true);

    et on appelle $variable dans le corps de son message, avec le reste de son texte, envoyé par la fonction php mail()

    meilleures salutations et encore bravo pour ce code.

  3. Pokemon_JOJO dit :

    Oui, c’est bien cela ;)

  4. frederic dit :

    Re-bonjour,

    je dis « Re »-bonjour, car après 4 mois de délais si j’ose dire, je reviens vers vous au sujet donc des détections de navigateurs.

    Comme je le disais dans on premier post de Février, je n’ai aucun problème avec le script fourni ici : je l’ai implanté dans mes pages, arrangé à ma sauce, je récupère même les données par mail php automatique, etc.. bref, que du Bonheur.

    En revanche, utilisant sur une page de mon site un script que je sais être incompatible avec Opéra (et j’ai eu beau faire, beau chercher une équivalence à ce code pour palier cette carence, il n’y a rien eu à faire), je voudrais arranger le code pour détecter simplement la présence d’Opéra, toutes versions, et surtout ensuite, REDIRIGER vers une page d’information, expliquant donc l’incompatibilité.
    Or j’ai eu beau essayer un « if(authorized) { header(’Location:mapageinfo.php’) }, ça ne fonctionne pas. Et puis de toutes façons, le array crée ici part du principe que les navigateurs détectés sont acceptés. Moi je voudrais justement l’inverse : interdire.

    Bref, je revenais pour savoir s’il est possible de ré-arranger le code dans ce sens ?

    Par avance, merci.
    Cordialement,
    Frédéric

  5. frederic dit :

    Re-bonjour

    j’ai bien reçu votre mail de réponse. Merci beaucoup. Je me rends compte par là-même que je n’ai douté de rien, en vous écrivant la veille d’un jour férié et d’un départ en congès prolongé de 4 jours pour tous les français… Merci donc d’autant plus de m’avoir répondu du tac-o-tac…

    Cela étant, 2 choses :

    -1) Finalement, j’ai renoncé à faire une redirection : il aurait fallu faire une autre page, remettre des infos, faire un bouton retour sinon d’autres encore, pour revenir aux autres pages du site, etc… Mauvaise idée. Aussi, voyant votre code de réponse utilisant un exit(), il m’est apparu clairement que je devais plutôt mettre le code dans une DIV et moyennant le bon emplacement dans le code, laisser s’afficher tous les élements de la page SAUF mon lecteur mp3 incompatible avec Opéra, pour alors afficher à la place, le texte d’alerte sur Opéra. Exactement à la façon des div alternatives pour la balise flash swfObject.

    -2) Le fait est que j’avais raison, puisque mon système a parfaitement fonctionné. CELA ÉTANT, votre code était partiellement erroné. Vous aviez oublié quelques points et autres accolades de syntaxe. Je donne donc ci-dessous le bon code : testé, vérifié sur Mac Intel, sur Opéra forcément, mais aussi sur Safari, Chrome et Firefox = 100% opérationnel sur serveur PHP5.

    Voilà, vous savez tout. En espérant que cela aidera d’autres personnes. En vous remerciant encore vivement, et en vousdisant à une prochaine fois ; cordialement,
    Frédéric

    P.S. : juste pour faire complet : la fin de votre code de réponse via un else header( »Location:mapagederedirection.php »); était de toutes façons inopérante… J’ai essayé là aussi de corriger avec les accolades php, les points-virgules, etc… Rien à faire…

  6. frederic dit :

    aah.. oups : les balises php du code de solution, l’ont fait disparaitre de mon post !! Pardon : ça doit être une protection de votre textearea.
    Je donne donc le code sans les balises ouvrantes et fermantes de php :

    $browser_name = get_browser_agent(’name’);
    if ( $browser_name == ‘opera’) {
    exit(’Cette page n’est pas compatible avec Opéra. Merci de bien vouloir choisir un autre navigateur.’);
    }

    Voila. Merci encore.
    Frédéric

  7. neum dit :

    Bonjour Pokemon,

    Juste un dernière précision sur la reconnaissance de l’Iphone…

    Si je mets :

    $platform_name = get_browser_agent(’platform’) {
    header( »Location:dossieriphone/indexiphone.php »);
    }

    est-ce correct ?

    Merci par avance.
    Neum

  8. neum dit :

    aarrrff… une ligne a sauté….

    Décidément, j’ai du mal avec les balises php… Pardon.

    Le code complet ci-dessous :

    $platform_name = get_browser_agent(’platform’);
    if ($platform_name == ‘iphone’) {
    header(’location:dossieriphone/indexiphone.php’);
    }

    merci et encore toutes mes excuses pour ce nouveau doublon..
    Neum

  9. neum dit :

    Rebonjour suite et fin der de der.

    Bon visiblement, vous êtes aux abonnés absents depuis quelques temps… J’espère que tout va bien pour vous…

    Ceci pour mettre un point final à mes interrogations : le code sur le get_browser-agent(platform’); est bel et bien ok. Puisque je ne peux pas encore tester le site sur iPhone (je suis toujours en localhost), au moins ai-je pu tester la reconnaissance de ma plateforme.. Mac : et l’identification est pleinement opérationnelle. Ca marchera donc pour n’importe quelle plateforme en tableau dans votre code, y compris forcément l’iPhone.

    Merci pour tout encore, bonne continuation et au plaisir.
    Neum

  10. Neum dit :

    Bonjour Pokémon,

    Je ré-essaie de vous écrire un petit mot en ce début Juin, en espérant que vous êtes de nouveau « opérationnel ». Et ce, pour une toute petite question :
    Il n’est pas fait mention, dans votre tableau de reconnaissance des navigateurs et des plateformes, de l’iPod. Uniquement de l’iPhone. Or, et d’après tout ce que j’ai lu, leurs détections sont différentes.
    Ma question est donc simple : suffit-il de rajouter une ligne « ‘iPod’ => array(’iPod’) » dans votre tableau pour que sa reconnaissance soit effective comme celle de l’iPhone, ou bien faut-il en faire plus ?

    En espérant que vous voudrez/pourrez me répondre, et cordialement,
    Neum

  11. Pokemon_JOJO dit :

    Bonjour, désolé je suis pas mal pris par le boulot en ce moment et je n’ai pas pris le temps de vous répondre.

    Un grand merci pour votre contribution. Concernant l’ipod, oui normalement cela devrai suffire. Rajoutez : ‘ipod’ => array(’ipod’), dans le tableau des « Plateforme connue » (bien mettre ipod en minuscule) et ça devrait faire le boulot.

    Au plaisir

    Jo

  12. Neum dit :

    Bonjour Pokémon,

    et donc, merci de votre réponse globale.

    Pour ce qui est de ma contribution, c’est peu de chose, et devant votre très grand talent et tout votre travail, en open source qui plus est, devant une telle réussite et surtout devant l’efficacité de vos scripts (car ils fonctionnent à 100% et sans être des usines à gaz de surcroît), c’était le moins que je pouvais faire. Je suis très content et pour tout dire un tantinet flatté que vous ayez apprécié.

    Pour le reste, ayant activé la barre de développement du Menu Safari sur Mac, j’ai pu simuler les « Users Agent » des différents navigateurs et des différentes plateformes (je travaille encore en « localhost ») : mac, pc, iphone, ipod touch, safari, firefox, chrome, explorer, opera, et tous, sous leurs 2 dernières versions connues. Et sur cet ensemble, toutes les redirections, les reconnaissances de navigateurs et/ou de plateformes ont fonctionné. Sans le moindre bug.

    C’est donc un réussite finale complète. Un très grand et un très chaleureux « Merci » à vous, Pokémon. Votre « module » php est de loin, de très très loin, le meilleur que j’ai jamais vu. Ne changez rien.

    Excellente continuation à vous et au plaisir de vous recroiser sur la toile.
    Bien sincèrement,
    Neum

Laisser une réponse

RSS du blog

© Copyright 2010 Pokemon_JOJO