Detección del navegador con php: checkBrowser

La detección del navegador que utiliza el usuario viene existiendo desde que el mundo es mundo. La había probado con JavaScript, sin mayor problema, pero nunca en PHP…. hasta ahora.

Para la realización de un proyecto he necesitado de dicha detección del navegador y, como la idea del proyecto es la de respetar lo más posible las pautas de Accesibilidad de la W3C, no debía ser con Javascript. Así que me dije, pués vale, la hago en PHP

Inocente de mi, y debido a que estoy 'mal acostumbrado' por los chicos de php.net, pensé que habría una función que hiciese el trabajo por mi pero me equivoqué. Lo más cercano que tenía, en la documentación de php.net, era la función get_browser() que intenta determinar las capacidades del navegador del usuario. Lo malo de esta función es que necesita tener disponible en el servidor el fichero browscap.ini

Ante este revés no deseperé, navegué por esos mundos de Internet, y no encontré nada que me resolviera la duda. Así qeu obté por fabricarme una ayuda 🙂 Utilizando un poco de cabeza, algo de expresiones regulares y cierto tiempo llegué a este solución.

La función ha sido comprobada para los siguiente navegadores:

Supongamos que tenemos este Array de cabeceras, reales pero reducidas por motivos de espacio, producidas para lo navegadores antes indicados (fijaros que las claves del Arrays indican el navegador usado en cada uno de los casos):

$Arr_ag = array();
$Arr_ag['firefox'] = 'Mozilla/5.0 (Windows; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4';
$Arr_ag['msie'] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;';
$Arr_ag['opera'] = 'Opera/9.00 (Windows NT 5.0; U; en)';
$Arr_ag['amaya'] = 'amaya/9.51 libwww/5.4.0';
$Arr_ag['maxthon'] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon;)';
$Arr_ag['lynx'] = 'Lynx/2.8.3.rel.1 libwww-FM/2.14FM';
$Arr_ag['epiphany'] = 'Mozilla/5.0 (X11; U; Linux686; en-US; rv:1.7.8) Epiphany/1.4.8';
$Arr_ag['galeon'] = 'Mozilla/5.0 (X11; U; Linux686; en-US; rv:1.7.8) Galeon/1.3.20';
$Arr_ag['safari'] = 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/417.9';

Para saber a qué navegador corresponde, aplicamos a cada elemento del Array la función chekcBrowser()

while(list($c,$v) = each($Arr_ag)){
	$tmp[] = checkBrowser($v);
}

Vemos que la salida producida por la detección del navegador, indicada a continuación, corresponde con los valores esperados.

Array
(
    [0] => Firefox/1.5.0.4
    [1] => Msie 6.0
    [2] => Opera/9.00
    [3] => Amaya/9.51
    [4] => Maxthon
    [5] => Lynx/2.8.3.rel.1
    [6] => Epiphany/1.4.8
    [7] => Galeon/1.3.20
    [8] => Applewebkit/417.9
)

El código encargado de la la detección es el siguiente:

function checkBrowser($valor){
	$Arr_c = array('maxthon','msie','firefox','galeon',
	'epiphany','applewebkit','opera','amaya','lynx','mozilla');
	$valor = ' ' . strtolower($valor);
	while(list($c, $v) = each($Arr_c)){
	if(strpos($valor, $v, 0)){return dimeVersion($v, $valor);}
	}
}
function dimeVersion($val, $cadena){
	$pat = '@('.$val.'(.[^ ]*))@i';
	preg_match_all($pat, $cadena, $arg);
	if(isset($arg[0][0])){
		return ucfirst(ereg_replace('(;)', '', $arg[0][0]));
	}
}

Sé que hay tantas soluciones a este problema como gente se haya encontrado con él, sencillamente, esta es la mía 🙂