Foros del Web » Programando para Internet » PHP »

[ APORTE ] parsear URLs de referals como Google y Yahoo

Estas en el tema de [ APORTE ] parsear URLs de referals como Google y Yahoo en el foro de PHP en Foros del Web. A veces uno quiere saber con que palabras se llegó a nuestro sitio para tener una estadistica o tomar alguna desición. Aca un codigo que ...
  #1 (permalink)  
Antiguo 09/02/2009, 11:02
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
[ APORTE ] parsear URLs de referals como Google y Yahoo

A veces uno quiere saber con que palabras se llegó a nuestro sitio para tener una estadistica o tomar alguna desición.

Aca un codigo que hice para ver con que palabras se llegó

Código PHP:
<?
Function parse_referal(){
  
$referer=$_SERVER['HTTP_REFERER'];
  if (
strstr($referer,'yahoo.')){
    
preg_match('/\?p=([0-9a-zA-Z.\+%]{1,})/'$referer$matches);      
  }else{
    
preg_match('/&q=([0-9a-zA-Z.\+%]{1,})/'$referer$matches);
  }  
return (
$matches[1]);  
}

echo 
parse_referal();
?>
Vean la version actualizada...... mas abajo que reconoce tambien el patron de MSN
__________________
Salu2!

Última edición por Italico76; 09/02/2009 a las 19:31
  #2 (permalink)  
Antiguo 09/02/2009, 16:44
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

En vez de usar if...else para decidir el patrón a utilizar, podrías emplear un array, donde el índice sea el buscador y el valor sea el patrón. Con un foreach identificas el buscador y utilizas el patrón correspondiente.

Gracias por el aporte
  #3 (permalink)  
Antiguo 09/02/2009, 19:15
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

okram: amigo, si uso un foreach seria ineficiente porque recoreria todos los elementos del array y aunque sean 2 o 3...... va en contra de lo que he aprendido.

Usar un break para salir del ciclo..... tampoco es algo que quiero hacer pero gracias igual porque me hicistes reflexionar un rato.

Aca un codigo que incluye al buscador MSN:

Código PHP:
<?
Function parse_referal(){
  
$referer$_SERVER['HTTP_REFERER'];
  
  
$pattern = array ('google'=>'/&q=([0-9a-zA-Z.\+%]{1,})/','yahoo'=>'/\?p=([0-9a-zA-Z.\+%]{1,})/','msn'=>'/\?q=([0-9a-zA-Z.\+%]{1,})/');
  
  
$matches=array(); // vacio
  
  
if (strstr($referer,'yahoo.'))
    
preg_match($pattern['yahoo'], $referer$matches);      
  else    
      if (
strstr($referer,'google.'))
        
preg_match($pattern['google'], $referer$matches);      
      else
        if (
strstr($referer,'msn.'))
          
preg_match($pattern['msn'], $referer$matches);      
          
return (
$matches[1]);  
}

echo 
parse_referal();
?>
Las expresiones tienen una parte en comun pero creo que no hace a la cuestion....asi que asi lo dejo :)

Valoro otras opiniones
__________________
Salu2!
  #4 (permalink)  
Antiguo 09/02/2009, 19:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

Es más limpio y legible si usas un switch().

Saludos
  #5 (permalink)  
Antiguo 09/02/2009, 20:15
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

GatorV: no veo como pueda hacerlo con switch porque $referer no me seriviria creo..... fijate que la proceso con strstr() en cada anidamiento del IF

Un abrazo
__________________
Salu2!
  #6 (permalink)  
Antiguo 09/02/2009, 21:58
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

Como ya te mencione en otro post, hablar de eficiencia es discutir quien fue primero, si el huevo o el gallo Ineficiente dices porque recorre el array, pero al hacer if... elseif... elseif... igual estamos evaluando condiciones una y otra vez. Por otro lado, no veo cuál es el problema en usar break; para romper el ciclo o continue; para saltar un loop. Además, usando un foreach el código se vuelve más flexible, pues para agregar buscadores sólo hace falta agregar el patrón al array. Incluso, en algún caso, podría usarse una base de datos para extraer los patrones y buscar. Es eficiente cuando uno mismo afirma que lo es.

Ahora, claro que se puede usar switch. Como te darás cuenta en el siguiente código, hay pequeños trucos que buscan explotar al máximo las cualidades de php

Código php:
Ver original
  1. function parse_referal() {
  2.  
  3.     // Le modifiqué esta línea para probar
  4.     # $referer = $_SERVER['HTTP_REFERER'];
  5.    $referer = 'http://search.msn.com/results.aspx?q=okram&FORM=MSNTST';
  6.  
  7.     $pattern = array ('google' => '/&q=([0-9a-zA-Z.\+%]{1,})/',
  8.                       'yahoo' => '/\?p=([0-9a-zA-Z.\+%]{1,})/',
  9.                       'msn' => '/\?q=([0-9a-zA-Z.\+%]{1,})/' );
  10.  
  11.     $matches = array(); // vacio
  12.  
  13.     switch(true):
  14.         case strstr($referer,'yahoo.'):
  15.             preg_match($pattern['yahoo'], $referer, $matches);      
  16.             break;
  17.         case strstr($referer,'msn.'):
  18.             preg_match($pattern['msn'], $referer, $matches);
  19.             break;
  20.         case strstr($referer,'google.'):
  21.             preg_match($pattern['google'], $referer, $matches);      
  22.             break;
  23.         default:
  24.             return false;
  25.             break;
  26.     endswitch;
  27.          
  28.     return ($matches[1]);  
  29.  
  30. }

Por último, como también ya te lo dije en otro mensaje, debes hacer el código lo más "readable" posible. Quiero decir, de fácil lectura. Para ello un poco de orden estaría bien. El servidor no te reclamará nada si ve tu código en más o menos líneas. Hay un artículo... dale una ojeada

  #7 (permalink)  
Antiguo 10/02/2009, 02:53
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

Cita:
switch(true):
Esa es muyyy buena! no la sabia

Cita:
al hacer if... elseif... elseif... igual estamos evaluando condiciones una y otra vez
Si se cumple la primera se deja de evaluar.......si se cumple la segunda se deja de evaluar,... si se cumple la i-esima no se evaluará la (i+1)-ésima. Eso si, es poco claro

Me gusto lo del switch..... GatorV decia.....pero yo no lo veia posible
__________________
Salu2!
  #8 (permalink)  
Antiguo 10/02/2009, 08:05
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

En un foreach, si se cumple en un loop N, dejas de ciclar (break;), si no, te lo saltas avanzas al siguiente (continue;). Es lo mismo. Como te dije, cada uno maneja sus códigos según su propio concepto de eficiencia.

He notado que siempre evitas usar ciertas estructuras de control como break;. Puedo preguntar por qué?

  #9 (permalink)  
Antiguo 10/02/2009, 08:54
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

Cita:
He notado que siempre evitas usar ciertas estructuras de control como break;. Puedo preguntar por qué
Si amigo. Antes usaba mucho break con for y otras estructuras de control con repeticion pero en la Universidad me prohibieron su uso y entonces no quiero volver a acostumbrarme.

Supuestamente es una mala-practica de programacion porque existen estructuras de control como while() donde el numero de ciclos no esta pre-determinado.

El curso era con Pascal, se que en otros lenguajes como C podes evaluar la condicion de lazo como en el while de de Pascal.........en fin..... [no necesariamente habira que usar while]

Esa es la razon
__________________
Salu2!
  #10 (permalink)  
Antiguo 10/02/2009, 09:09
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

El punto es que muchas veces realmente necesitas escapar de ciclos u otras estructuras. El switch es un ejemplo. Si no colocas break; allí no hay forma de hacer que funcione.

while, foreach, for, etc. crean ciclos en base a sus propias condiciones, pero hay ocasiones en las que tú debes imponer las tuyas. Por ejemplo. Necesitas extraer unas noticias de una base de datos. Pero quieres mostrar 3 con un formato especial, y las siguientes con otro tipo de formato. Harías dos consultas? Lo más práctico (al menos para mí) sería pedir todas las noticias (digamos que quiero mostrar 10) a la base de datos, y usar un primer ciclo, del cuál escaparé usando break; al llegar a la tercera noticia. Luego, al hacer un segundo ciclo, éste empezará en la 4ta noticia pues el puntero del array de resultados allí se encuentra.

Se puede prescindir de él, y generalmente hay otras opciones, pero muchas veces el no querer usarlo conlleva más código del que en realidad se necesitaría.

  #11 (permalink)  
Antiguo 10/02/2009, 13:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: [ APORTE ] parsear URLs de referals como Google y Yahoo

Cita:
El punto es que muchas veces realmente necesitas escapar de ciclos u otras estructuras. El switch es un ejemplo. Si no colocas break; allí no hay forma de hacer que funcione.
Eso es porque break es la palabra reservada de la estructura switch-case pero no tiene 'nada que ver'*, digo en otros lenguajes es CASE OF por ejemplo y no aparece la palabra "break" obligadamente en ninguna parte de la estructura.

En lo demas......puede que tengas razon! de hecho....creo que lo tienes! el FOREACH es un caso paradigmatico creo porque tiene una potencia que no la tenes con otras estructuras de control..... y lo unico "malo" es que no se puede especificar una condicion adiciona al numero de elementos de un arreglo pero usando break........

Gracias por compartir tu punto de vista!

(*) En realidad SI tiene que ver........porque implicitamente esta el CONCEPTO del break..... pero como decia...... no tiene porque llamarse break puede ser una llave un end u otro delimitador en la estructura de control
__________________
Salu2!
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:01.