Hola a todos! He encontrado x ahí este script k sirve para detectar k navegador está corriendo el cliente k intenta conectarse a nuestro servidor. Esto puede interesarnos por ejemplo a la hora de elegir un exploit específico para un navegador en concreto.
En
turquesa las modificaciones y mejoras propuestas en el
codigo original.
Lo publico para k me ayudéis a entender mejor como funciona y para ver si entre todos podemos mejorarlo ya k hay algunos navegadores k no detecta.
function ObtenerNavegador($user_agent)
{
$navegadores = array
(
'Opera' => '(Opera)',
'Mozilla Firefox'=> '((Firebird)|(Firefox))',
'Galeon' => '(Galeon)',
'Mozilla'=>'(Gecko)',
'MyIE'=>'(MyIE)',
'Lynx' => '(Lynx)',
'Netscape' => '((Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79))',
'Konqueror'=>'(Konqueror)',
'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',
'Internet Explorer' => '(MSIE)', // Simplificar Internet Explorer 4,5,6,7... a Internet Explorer
'Google Chrome' = > '(Chrome)',
);
foreach($navegadores as $navegador=>$pattern){
if(preg_match($pattern, $user_agent))
return $navegador;
}
return "desconocido";
}
echo ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);Esta es la parte k no entiendo muy bien:
foreach($navegadores as $navegador=>$pattern){
if(preg_match($pattern, $user_agent))
return $navegador;Aunque una explicación sencilla de como opera el codigo a nivel general tampoco vendría mal!
Un saludo familia!

EDITO
-----------
Voy a hacer un resumen de lo que hemos sacado en claro para fijar conocimientos y para que quién lea el tema no tenga que ir subiendo y bajando todo el rato.
Esto es un resumen de la información que han aportado todos los participantes en el tema.1.
function ObtenerNavegador($user_agent)Creamos la
función ObtenerNavegador y la
variable $user_agent. Lo que viene a continuación está dentro de la
función ObtenerNavegador.
2.
$navegadores = array 'x' => '(y)' ... ...Creamos el
vector $navegadores con
indice = 'x' y
contenido = '(y)'3.
foreach($navegadores as $navegador=>$pattern)Para poder operar mejor con el índice y el contenido creamos una
variable $navegador para referirnos a
'x' (índice) y una
variable $pattern para referirnos a
'(y)' (contenido)4.
if(preg_match($pattern, $user_agent))
return $navegador;-
if(preg_match($pattern, $user_agent)) = Busca todos los valores posibles de
$pattern (osea de
'(y)') dentro del valor de
$user_agent y si encuentra una coincidencia
-
return $navegador; = Devuelve el valor de
$navegador correspondiente a ese valor
$pattern. (osea devuelve el valor de
'x' correspondiente a esa
'(y)')
-
return "desconocido"; = Si no encuentra ninguna coincidencia nos devuelve desconocido.
5.
echo ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);Imprimimos el resultado de la
función ObtenerNavegador para
user_agent = $_SERVER['HTTP_USER_AGENT'] (le pedimos al servidor que nos proporcione el valor de la variable
$user_agent (la cabecera user-agent)).
DESGLOSE DE LA EXPRESIÓN $patternVamos a utilizar el ejemplo de
Internet Explorer 7 para explicar esta expresión.
La cabecera
user-agent de IE7 no nos devuelve un valor exactamente igual al que contiene la viariable
$pattern = (MSIE 7\.[0-9]+) cuando se la pedimos. Devolverá algo como MSIE 7.01232141. Entonces, ¿como se comprueba que la cabecera
user-agent contiene el valor de
$pattern?
$pattern es una
expresión regular. Los paréntesis
(MSIE 7\.[0-9]+
) se usan para agruparla y en este caso se pueden descartar. La parte hasta el 7, osea (
MSIE 7\.[0-9]+), tiene que coincidir exactamente con el contenido de la cabecera
user-agent. El punto (MSIE 7\
.[0-9]+) es un carácter especial en las expresiones regulares (significa que se aceptará cualquier carácter como válido), así que para evitar que interprete eso en vez de un punto normal, hay que meter la barra invertida (MSIE 7
\.[0-9]+) que sirve para salirse de la expresión. (MSIE 7\.
[0-9]+) indica que se aceptará como válido un caracter entre 0 y 9. Se pueden usar otros conjuntos como [d-k], [adgkq35] o, uno muy común, [a-zA-Z0-9]. Y por último el (MSIE 7\.[0-9]
+) indica que el último carácter debe aparecer por lo menos una vez, pero que puede aparecer más veces.
Por lo tanto la expresión $pattern busca una linea en la cabecera user-agent que contenga ''MSIE 7.'' seguido por un número del 0 al 9 que obligatoriamente debe estar presente al menos una vez.if(preg_match($pattern, $user_agent)) Está línea comprueba que la expresión regular
$pattern puede generar la cadena
$user_agent. Se dice que una expresión regular r genera la cadena s si a partir de r se puede llegar a obtener s.
Por ejemplo, [ab]+ genera las cadenas a, b, aa, ab, ba, bb, aaa...
Si veis algún error corregidme por favor!
Gracias a todos por colaborar
