Saltar al contenido

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 🙂

7 comentarios

  1. Muy bueno. Me sirvio muchisimo porque tenia un problema con un reproductor flash en IE y con el resto andaba perfecto.

  2. David David

    Buenas, yo normalmente usaba las condicionales de html(que creo recordar cumplen la W3C), pero lo malo de esto es que por ejemplo si era para IE6,otro explorador y IE7, debía repetir el código de ese otro explorador y de IE7 con las mismas características(normalmente), ya que si solo dejaba el IE6, incomprensiblemente IE7 lo tomaba como suyo.
    Pero esto era algo mas engorroso y se repetía mucho código, con esta función tuya queda todo mucho mas claro, pero vaya curro te has pegado.
    Un saludo y muy buen aporte!

    PD: Si te interesa las condicionales HTML aquí hay mas información: http://www.webtaller.com/construccion/lenguajes/html/lecciones/comentarios-condicionales-de-IE-html.php

  3. Lewis Valenzuela Lewis Valenzuela

    Brother te pasaste si fueras mujer ya te hubiera hecho mia… para poder codificar jajaj gracias

  4. solo comentar que la variable $ya nunca llega a ser true y porque queda en la linea posterior al return, de forma que es innecesario el chequeo que se hace de la misma.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Jorge Hoya.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a OVH que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Esta web utiliza cookies, puedes lees sobre ellas en la política de cookies    Ver política de cookies
Privacidad