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.

3 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 ;)

Laisser une réponse

RSS du blog

© Copyright 2010 Pokemon_JOJO