Detectando navegadores con PHP

This post was published 8 years ago. It may be exremely outdated.

Saber el navegador con el que se accede a nuestras páginas web es algo muy útil. Lo podemos utilizar para cargar algo de CSS / Javascript específico para un navegador (como por ejemplo, para evitar errores con IE6), también lo podemos usar para cargar una página completamente distinta en navegadores antiguos y, ¿por qué no? para mostrar una página específica para móviles.

Ya he comentado este tema en otras ocasiones, pero esta vez ampliaré el rango de navegadores a detectar, concretamente nos centraremos en Internet ExplorerFirefox, SafariOpera, Konqueror, Chrome, iPod Touch, iPhone, Android (vale, estos tres no son navegadores, pero en estos casos me refiero a detectar el sistema operativo) o cualquier tipo de navegador para móvil.

En esta ocasión crearemos una función que acepte dos parámetros: el navegador que queremos buscar y la versión específica que buscamos (si es que buscamos alguna versión en especial). Para el primer parámetro, usaremos una serie de identificadores:

Identificador Navegador
IE Internet Explorer
FF Firefox
SF Safari
OP Opera
KQ Konqueror
CH Chrome
IPD iPod
IPH iPhone
IPO iPod / iPhone
AD Android
MB Navegador de móvil

Sobre la versión del navegador, sólo nos centraremos en las versiones de Internet Explorer.

La función seguirá la siguiente estructura:

  1. Cargamos en una variable el agente de usuario del visitante.
  2. Mediante un bucle foreach determinamos en qué navegador buscamos.
  3. Mediante la función strrpos comprobamos si el agente de usuario se corresponde con el del navegador que buscamos.
  4. Sólo si buscamos Internet Explorer: Detectamos si se ha accedido con la versión que hemos establecido (si es que hemos establecido alguna versión).
  5. Sólo si buscamos un navegador móvil: Buscamos alguno de los diversos agentes de usuario que tienen los diferentes navegadores para móviles.
  6. Devolvemos el valor true si se ha detectado el navegador en cuestión y false si no se ha detectado, a través de una variable que tiene por defecto el valor false y sólo cambia a true al detectarse el navegador.

Finalmente todo esto traducido a PHP quedaría así:

	function is_browser($name, $version='') {
		$user_agent = $_SERVER['HTTP_USER_AGENT']; // Cargamos el UserAgent en una variable
		$wtr = false; // Esta variable es la que indica si se ha accedido con el navegador que buscamos o no. Por defecto es false, sólo cambia si se accede con el navegador buscado
		$wtmb = ''; // Esta variable almacena el navegador del dispositivo móvil (sólo si buscamos un navegador de dispositivo móvil, esto no incluye ni Android ni iPod ni iPhone)
		// Primero veamos a quién buscamos y luego comprobemos si es él
		switch ($name) {
			// Caso Internet Explorer
			case 'IE':
				if (strrpos($user_agent, "MSIE") === false) {} else {
					if ($version != '') {
						if (strrpos($user_agent, 'MSIE '.$version) === false) {} else { $wtr = true; }
					} else {
						$wtr = true;
					}
				}
				break;
			// Caso Firefox
			case 'FF': if (strrpos($user_agent, "Firefox") === false) {} else { $wtr = true; } break;
			// Caso Opera
			case 'OP': if (strrpos($user_agent, "Opera") === false) {} else { $wtr = true; } break;
			// Caso Konqueror
			case 'KQ': if (strrpos($user_agent, "Konqueror") === false) {} else { $wtr = true; } break;
			// Caso Chrome
			case 'CH': if (strrpos($user_agent, "Chrome") === false) {} else { $wtr = true; } break;
			// Caso Safari
			case 'SF': if (strrpos($user_agent, "Safari") === false) {} else { $wtr = true; } break;
			// Caso iPod
			case 'IPD': if (strrpos($user_agent, "iPod") === false) {} else { $wtr = true; } break;
			// Caso iPhone
			case 'IPH': if (strrpos($user_agent, "iPhone") === false) {} else { $wtr = true; } break;
			// Caso iPod o iPhone
			case 'IPO':
				if (strrpos($user_agent, "iPod") === false) {} else { $wtr = true; }
				if (strrpos($user_agent, "iPhone") === false) {} else { $wtr = true; }
				break;
			// Caso Android
			case 'AD': if (strrpos($user_agent, "Android") === false) {} else { $wtr = true; } break;
			// Caso navegador móvil
			case 'MB':
				$mua = array(
					'PIE4' => 'compatible; MSIE 4.01; Windows CE; PPC; 240x320',
					'PIE4_Smartphone' => 'compatible; MSIE 4.01; Windows CE; Smartphone;',
					'PIE6' => 'compatible; MSIE 6.0; Windows CE;',
					'Minimo' => 'Minimo',
					'OperaMini' => 'Minimo',
					'AvantGo' => 'AvantGo',
					'Plucker' => 'Plucker',
					'NetFront' => 'NetFront',
					'SonyEricsson' => 'SonyEricsson',
					'Nokia' => 'Nokia',
					'Motorola' => 'mot-',
					'BlackBerry' => 'BlackBerry',
					'WindowsMobile' => 'Windows CE',
					'PPC' => 'PPC',
					'PDA' => 'PDA',
					'Smartphone' => 'Smartphone',
					'Palm' => 'Palm'
				);
				foreach($mua as $nav => $ua){ if(strstr($user_agent, $ua) != false) { $wtmb = $nav; } }
				if ($wtmb != '') { $wtr = true; }
				break;
			// Caso genérico
			default: $wtr = false; break;
		}
		return $wtr;
	}

Finalmente el uso es muy sencillo, basta con verificar el valor que devuelve la función, de modo que si buscamos, por ejemplo, a Opera, usaríamos el siguiente código:

if (is_browser('OP')) {
/* Código específico para Opera */
} else {
/* Código para el resto de navegadores */
}

2 Responses to Detectando navegadores con PHP

Leave a Reply