Ver Mensaje Individual
  #17 (permalink)  
Antiguo 14/05/2013, 11:43
matake
 
Fecha de Ingreso: mayo-2013
Mensajes: 191
Antigüedad: 11 años, 6 meses
Puntos: 10
Respuesta: Excluir palabras de una consulta

Hola,

Perdonen el retraso pero he querido estar un poco mas seguro a la hora de postear para no alargar mucho la charla.


Gracias jurena por responder ... con un poco suerte y usando algo de logica he llegado a encontrar lo de la equivalencia de /b y [[:<:]] buscando entender porque los testers online no acceptan la expresion [[:<:]] ... incluso abri un tema por esto en el foro regex por si sabe alguien algun tester regex online que accepte esto [[:<:]]

hace unos dias me respondi solo en aquel foro y he dado el tema por resuelto.

Pero de todos modos Gracias jurena ... imaginate que no lo habia encontrado. Tu respuesta me habria sido de gran ayuda.

Ademas tenias razon ... estaba yo equivocado en pensar que solo con esto resolveria mi asunto.

Por esto decidi de mejor tardar un poquito que lanzarme en postear otra y otra vez.

Al final si lo he conseguido ... aqui dejo la solucion por si alguien la necesita o encuentra algun error o alguna mejora:

Código MySQL:
Ver original
  1. SELECT id, campo
  2. FROM tabla
  3.     campo REGEXP '[[:<:]]".$busqueda."'=1
  4.     AND NOT(
  5.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,1)).")[[:>:]]'=1
  6.             AND
  7.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,1)).")[a-z]{1,}[[:>:]]'=0
  8.         OR(
  9.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,2)).")[[:>:]]'=1
  10.             AND
  11.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,2)).")[a-z]{1,}[[:>:]]'=0
  12.         )
  13.         OR(
  14.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,3)).")[[:>:]]'=1
  15.             AND
  16.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,3)).")[a-z]{1,}[[:>:]]'=0
  17.         )
  18.         OR(
  19.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,4)).")[[:>:]]'=1
  20.             AND
  21.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,4)).")[a-z]{1,}[[:>:]]'=0
  22.         )  
  23.         OR(
  24.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,5)).")[[:>:]]'=1
  25.             AND
  26.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,5)).")[a-z]{1,}[[:>:]]'=0
  27.         )              
  28.     )

Explico la parte PHP:

la variable $busqueda puede tomar cualquier valor

La funcion excluidos($busqueda,$nr) me devuelve un array()con todas las palabras excluidas que empiezan por $busqueda y tienen como longitud 1,2,3,4,5 ... caracteres (si no hay ninguna palabra me devuelve el caracter "!" ) ... que luego empleando implode uso "|" como division y sale una cadena asi: para|esta|bien etc ... dependiendo de las palabras excluidas que encuentra ... o si no encuentra ninguna la cadena tendra solo el caracter de exclamacion "!" .
Dicha cadena ayuda la construccion de la expresion regular y saldra algo como:
Código MySQL:
Ver original
  1. campo REGEXP '[[:<:]](para|esta|bien)[a-z]{1,}[[:>:]]'=0
  2.         AND
  3.         campo REGEXP '[[:<:]](para|esta|bien)[[:>:]]' =1
  4.  
  5.  
  6. /* o si no hay palabras .... para evitar errores  saldra asi */
  7.  
  8. campo REGEXP '[[:<:]](!)[a-z]{1,}[[:>:]]'=0
  9.         AND
  10.         campo REGEXP '[[:<:]](!)[[:>:]]' =1

el numero como parametro dentro de la funcion implode("|",excluidos($busqueda,1)) es para buscar palabras excluidos de un caracter como "y" "o" ...
implode("|",excluidos($busqueda,2)) para palabras de dos caracteres como "de" "pe" "si" "no" etc

siguiendo asi con palabras de tres caracteres 4 5 ... etc ... hasta llegar a palabras como "ciclopentanoperhidrofenantreno"

esto si. Siempre hay que añadir un par de consultas para la longitud de la nueva palabra .... por ejemplo si pongo como excluido palabra "estado" ... etc de 6 caracteres tengo que añadir la consulta:
Código MySQL:
Ver original
  1.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,6)).")[[:>:]]'=1
  2.             AND
  3.             campo REGEXP '[[:<:]](".implode("|",excluidos($busqueda,6)).")[a-z]{1,}[[:>:]]'=0
  4.         )

Cosas que se pueden automatizar con programacion

No pongo todavia como solucionado por si se me ha escapado algun error ... pero en unos dias si veo que no hay opiniones lo pondre como resuelto

Doy la gracias otra vez a jurena y gnzsoloyo por su ayuda e ideas


Saludos