Foros del Web » Programando para Internet » PHP »

Expresión regular para separar datos HTTP_USER_AGENT

Estas en el tema de Expresión regular para separar datos HTTP_USER_AGENT en el foro de PHP en Foros del Web. Hola amigos Necesito separar los datos dados por $_SERVER['HTTP_USER_AGENT']. Si tengo esta cadena: Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Necesito tener por separado lo ...
  #1 (permalink)  
Antiguo 23/10/2011, 15:50
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Pregunta Expresión regular para separar datos HTTP_USER_AGENT

Hola amigos

Necesito separar los datos dados por $_SERVER['HTTP_USER_AGENT']. Si tengo esta cadena:

Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1

Necesito tener por separado lo de antes de los paréntesis, lo de entre los paréntesis y lo de después de los paréntesis.

Se me ocurrió un par de explodes() pero eso es una chapuza. ¿Alguien podría ayudarme a construir una sencilla expresión regular?


Un saludo y mil gracias.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #2 (permalink)  
Antiguo 23/10/2011, 16:28
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Claro, puedes comenzar por leer ésto http://www.forosdelweb.com/f18/aport...s-pcre-646110/
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #3 (permalink)  
Antiguo 23/10/2011, 16:44
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Ok, he hecho esto que no sirve:

Código PHP:
Ver original
  1. public function SepararDatosUltimoAcceso($datos) {
  2.  
  3.         $matches = array();
  4.        
  5.         preg_match_all("/(.)\((.)\)(.)/", $datos, $matches, PREG_SET_ORDER);
  6.        
  7.         return $matches;
  8.    
  9.     }

la expresión regular es que quiero todo lo primero, luego lo de entre paréntesis y luego el resto, pero creo que no lo entendí del todo

saludos
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #4 (permalink)  
Antiguo 23/10/2011, 17:02
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Eso quería, que pusieras un poco de tu parte

Te faltaron dos cositas:
* Si te fijas, entre lo primero y el paréntesis está un espacio, el cual no pones en tu expresión regular.
* Estás haciendo uso de punto (que es capturar cualquier caracter) pero no estás poniendo un cuantificador, por lo que tu RegEx expera sólo un caracter. El cuantificador que debes usar es *

Tu expresión regular quedaría:
Código PHP:
Ver original
  1. /(.*) \((.*)\) (.*)/

Se traduciría a:
(captura) espacio paréntesis(cualquier caracter 1+ veces)paréntesis espacio (cualquier caracter 1+ veces)

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #5 (permalink)  
Antiguo 23/10/2011, 17:20
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Genial ! Funciona bien.

Sólo una pregunta: si yo tengo esta cadena:

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

La cual no tiene el último parámetro buscado, no me da ninguna coincidencia la función.

Código PHP:
Ver original
  1. public function SepararDatosUltimoAcceso($datos) {
  2.  
  3.         $salida = array();
  4.         $matches = array();
  5.         preg_match_all("/(.*) \((.*)\) (.*)/", $datos, $matches, PREG_SET_ORDER);
  6.  
  7.         return $matches;
  8.     }

además el maldito IE otorga los datos que le sale de las narices. Entonces, cómo solucionar este inconveniente? Hay manera de que el último parámetro sea opcional?
Le he puesto una interrogación en el último parámetro pero no parece funcionar:

Código PHP:
Ver original
  1. /(.*) \((.*)\) (.*)?/

Un saludo y mil gracias!
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #6 (permalink)  
Antiguo 23/10/2011, 17:30
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Con muy mala suerte me he encontrado con la cadena de Google Chrome:

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1

Esto se vuelve peliagudo. ¿Cómo puedo hacer un patrón opcional?

saludos y gracias de nuevo
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #7 (permalink)  
Antiguo 23/10/2011, 17:32
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Que tal CHuLoSoY,

No dispones de get_browser ?, en caso negativo talves te sirva alguna de las funciones que han posteado alli los usuarios.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 23/10/2011, 17:35
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

gracias @masterpuppet pero desgraciadamente, parece ser que get_browser() necesita de configuración específica en el server, del cual no tengo permisos ni recursos para gestionarlo.
Así que tendré que conformarme con volverme loco con todas estas cadenas.
Necesito la de IE, Firefox, Opera y Webkit (chrome, safari, rekonq, etc). Son sólo cuatro jajaja. Estoy intentándolo pero va muy mal:

Código PHP:
Ver original
  1. public function SepararDatosUltimoAcceso($datos) {
  2.  
  3.         $matches = array();
  4.         preg_match_all("/(.*) \((.*)\) (.*)/", $datos, $matches, PREG_SET_ORDER);
  5.  
  6.         if (preg_match("/MSIE/", $matches[0][2])) { $matches[0][3]="Internet Explorer"; }
  7.         elseif (preg_match("/Firefox/", $matches[0][3])) { $matches[0][3]="Firefox"; }
  8.         /** AÚN ESTOY INTENTÁNDOLO PARA INTERNET EXPLOTTER **/
  9.         return $matches;
  10.     }

saludos
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #9 (permalink)  
Antiguo 23/10/2011, 17:48
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Lastima, pero estas seguro que la función getBrowser que han posteado allí no te sirve ?, esta en concreto: http://www.php.net/manual/en/functio...ser.php#101125.

Con respecto a la regex ten en cuenta que estas dejando un espacio en blanco antes del último grupo, el cual también debería ser opcional.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 23/10/2011, 17:49
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

como bien dice la nota en esa página:

Cita:
Nota:

Para que esto funcione, la configuración de browscap en php.ini debe apuntar a la ubicación correcta del archivo browscap.ini en su sistema.

browscap.ini no está incluido con PHP, pero se pude encontrar un archivo actualizado aquí » php_browscap.ini.

Mientras que browscap.ini contiene información sobre muchos navegadores, recae en el usuario la actualización para mantener la bases de datos vigente. El formato del archivo se explica por sí solo.
voy a probar que el espacio sea opcional

gracias por la idea y un saludo
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #11 (permalink)  
Antiguo 23/10/2011, 18:01
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Bien! así funciona:

Código PHP:
Ver original
  1. preg_match_all("/(.*) \((.*)\)\s*(.*)/", $datos, $matches, PREG_SET_ORDER);

PERO : Sigo teniendo un problema con la cadena de google chrome. Hay dos parámetros entre paréntesis, y no me funciona poniendo cuantificador {,2}

¿sabrías cómo?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #12 (permalink)  
Antiguo 23/10/2011, 19:24
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Prueba la función que te dice masterpuppet, igual esa información desde HTTP_USER_AGENT no es que sea muy confiable.

Código PHP:
Ver original
  1. <?php
  2.  
  3. //http://www.php.net/manual/en/function.get-browser.php#101125
  4.  
  5. function getBrowser()
  6. {
  7.     $u_agent = $_SERVER['HTTP_USER_AGENT'];
  8.     $bname = 'Unknown';
  9.     $platform = 'Unknown';
  10.     $version= "";
  11.  
  12.     //First get the platform?
  13.     if (preg_match('/linux/i', $u_agent)) {
  14.         $platform = 'linux';
  15.     }
  16.     elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
  17.         $platform = 'mac';
  18.     }
  19.     elseif (preg_match('/windows|win32/i', $u_agent)) {
  20.         $platform = 'windows';
  21.     }
  22.    
  23.     // Next get the name of the useragent yes seperately and for good reason
  24.     if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent))
  25.     {
  26.         $bname = 'Internet Explorer';
  27.         $ub = "MSIE";
  28.     }
  29.     elseif(preg_match('/Firefox/i',$u_agent))
  30.     {
  31.         $bname = 'Mozilla Firefox';
  32.         $ub = "Firefox";
  33.     }
  34.     elseif(preg_match('/Chrome/i',$u_agent))
  35.     {
  36.         $bname = 'Google Chrome';
  37.         $ub = "Chrome";
  38.     }
  39.     elseif(preg_match('/Safari/i',$u_agent))
  40.     {
  41.         $bname = 'Apple Safari';
  42.         $ub = "Safari";
  43.     }
  44.     elseif(preg_match('/Opera/i',$u_agent))
  45.     {
  46.         $bname = 'Opera';
  47.         $ub = "Opera";
  48.     }
  49.     elseif(preg_match('/Netscape/i',$u_agent))
  50.     {
  51.         $bname = 'Netscape';
  52.         $ub = "Netscape";
  53.     }
  54.    
  55.     // finally get the correct version number
  56.     $known = array('Version', $ub, 'other');
  57.     $pattern = '#(?<browser>' . join('|', $known) .
  58.     ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
  59.     if (!preg_match_all($pattern, $u_agent, $matches)) {
  60.         // we have no matching number just continue
  61.     }
  62.    
  63.     // see how many we have
  64.     $i = count($matches['browser']);
  65.     if ($i != 1) {
  66.         //we will have two since we are not using 'other' argument yet
  67.         //see if version is before or after the name
  68.         if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
  69.             $version= $matches['version'][0];
  70.         }
  71.         else {
  72.             $version= $matches['version'][1];
  73.         }
  74.     }
  75.     else {
  76.         $version= $matches['version'][0];
  77.     }
  78.    
  79.     // check if we have a number
  80.     if ($version==null || $version=="") {$version="?";}
  81.    
  82.     return array(
  83.         'userAgent' => $u_agent,
  84.         'name'      => $bname,
  85.         'version'   => $version,
  86.         'platform'  => $platform,
  87.         'pattern'    => $pattern
  88.     );
  89. }
  90.  
  91. // now try it
  92. $ua=getBrowser();
  93. $yourbrowser= "Your browser: " . $ua['name'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
  94. print_r($yourbrowser);
  95. ?>
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #13 (permalink)  
Antiguo 23/10/2011, 19:31
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Si quieres evitar complicaciones con más regexp, puedes realizar esto:
Código PHP:
Ver original
  1. preg_match_all('/(.*) \((.*)\)\s*(.*)/', $str, $matches);
  2.  
  3. if(isset($matches[3][0]) && substr($matches[3][0], 0, 6) == 'Chrome') {
  4.     preg_match_all('/(.*) \((.*)\) (.*) \((.*)\) (.*)/', $str, $matches);
  5. }

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #14 (permalink)  
Antiguo 24/10/2011, 03:48
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Expresión regular para separar datos HTTP_USER_AGENT

Gracias @andresdzphp! Esa función sí que me sirve, aunque un poco larga, trataré de convertirla a OOP y os la comparto!

Y @Sourcegeek, mil gracias, esa idea también está muy bien. Creo que combinaré los dos.

A todos un saludo y gracias de nuevo!
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Etiquetas: regular
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:57.