Autor Tema: Resaltar palabras de busqueda especial  (Leído 1851 veces)

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Resaltar palabras de busqueda especial
« en: 29 de Julio de 2011, 22:52:22 pm »
Hola, tengo una pequeña consulta que haceros...
¿Como puedo marcar la palabra consultada y que siempre obligue a la consulta a imprimirse desde donde encontro la palabra consultada o que permita verse dos palabras anteriores al la palabra consultada?

 
Lo que estoy intentando hacer es como la que muestra el google, lista la palabra marcada en negrilla e imprime justo en su ubicación. Estoy muy agradecido de antemano la ayuda que pueda.

P.D: También deciros que con str_replace() o str_irpelace() no me ha funcionado, ya que el primero es sensible a mayusculas y minusculas y el segundo no, pero si en la BD pone:
Citar
Tercera noticia
y tu buscas
Citar
tercera Noticia
el te resalta así:
Citar
tercera Noticia
Y me gustaría que se quedase como en la BD:
Citar
Tercera noticia

Comunidad PHPeros

Resaltar palabras de busqueda especial
« en: 29 de Julio de 2011, 22:52:22 pm »

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #1 en: 29 de Julio de 2011, 23:40:23 pm »
Hola, tengo una pequeña consulta que haceros...
¿Como puedo marcar la palabra consultada y que siempre obligue a la consulta a imprimirse desde donde encontro la palabra consultada o que permita verse dos palabras anteriores al la palabra consultada?

 
Lo que estoy intentando hacer es como la que muestra el google, lista la palabra marcada en negrilla e imprime justo en su ubicación. Estoy muy agradecido de antemano la ayuda que pueda.

P.D: También deciros que con str_replace() o str_irpelace() no me ha funcionado, ya que el primero es sensible a mayusculas y minusculas y el segundo no, pero si en la BD pone:y tu buscasel te resalta así:Y me gustaría que se quedase como en la BD:

Con stristr() puedes obtener la posición del texto, con eso usas substr para mostrar lo anterior, muestras el texto en negrita con otro substr entre medias, y luego otro substr para mostrar otra parte, algo así

<?php
$texto 
= &#39;Esto es una prueba para buscar en un texto y resaltar las palabras cercanas&#39;;
$buscar = &#39;resaltar&#39;;
$pos stristr($texto$buscar);
echo 
substr($texto, ($pos-5), 5); // mostramos 5 caracteres anteriores
echo &#39;<b>&#39;; // negrita
echo substr($texto$posstrlen($buscar)); // mostramos la palabra
echo &#39;</b>&#39;; // cerramos negrita
echo substr($texto, ($pos+strlen($buscar)), 5); // mostramos 5 caracteres posteriores
?>

No es muy dificil de entender, y supongo que funcionará, cualquier duda consúltala.

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #2 en: 30 de Julio de 2011, 00:02:26 am »
Esa idea está genial para situarse en la palabra, pero hay dos cosas:
1.-Me da este error en esta linea: substr($noticia['texto'], $pos, strlen($busqueda)).
Citar
Warning: substr() expects parameter 2 to be long, string given in ::::::

2.-Lo de poner en negrita no me acaba de entrar por los ojos... por que, ¿y si estoy buscando más de una palabra? Supongo que habrían problemas.

Gracias westwest ^^

Desconectado ferdi342

  • PHPero Experto
  • *****
  • Mensajes: 734
  • Karma: 8
  • Sexo: Masculino
  • Gúgol
    • Ver Perfil
    • Google - La solución a todo
Re:Resaltar palabras de busqueda especial
« Respuesta #3 en: 30 de Julio de 2011, 00:29:51 am »
Yo lo que haría sería con strpos() buscar si la palabra consultada existe en la cadena y en caso de que existe hacerla cambiar con str_replace()

PD: Más información sobre las funciónes en www.php.net en caso de que no te saliera ya sabes postea ;)

EDITO:

Aquí te dejo un ejemplo de cada una e las funciones ;)

//strpos()
Código: [Seleccionar]
<?
//strpos() sólo devuelve un valor FALSE
$cadena="Hola mundo";
$quebuscar="Hola";
$buscar=strpos($cadena, $quebuscar);
if($buscar==FALSE){
echo ''.$quebuscar.' no se encuentra en '.$cadena.";
}
else {
echo ''.$quebuscar.' si se encuentra en '.$cadena.";
}
?>

//str_replace()
Código: [Seleccionar]
<?
$texto= "Vamos a reemplazar la vieja palabra por la nueva";
$vieja = "vieja";
$nueva = "nueva";
$oldText$texto= str_replace($vieja , $nueva , $texto);
echo $texto;
?>
« Última modificación: 30 de Julio de 2011, 00:40:10 am por ferdi342 »
A veces hay que dejar terminar cosas buenas para que empiecen mejores, How I Met Your Mother

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #4 en: 30 de Julio de 2011, 00:34:49 am »
Mira el Post Data del primer post:
P.D: También deciros que con str_replace() o str_irpelace() no me ha funcionado, ya que el primero es sensible a mayusculas y minusculas y el segundo no, pero si en la BD pone:y tu buscasel te resalta así:Y me gustaría que se quedase como en la BD:

Desconectado ferdi342

  • PHPero Experto
  • *****
  • Mensajes: 734
  • Karma: 8
  • Sexo: Masculino
  • Gúgol
    • Ver Perfil
    • Google - La solución a todo
Re:Resaltar palabras de busqueda especial
« Respuesta #5 en: 30 de Julio de 2011, 00:40:40 am »
Mira el Post Data del primer post:

He puesto ejemplos haber si te ayudan ;)
A veces hay que dejar terminar cosas buenas para que empiecen mejores, How I Met Your Mother

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #6 en: 30 de Julio de 2011, 01:06:28 am »
Prueba tú con esto y dime que ocurre:

<?PHP
$texto= "Vamos a reemplazar la vieja palabra por la nueva";
$busca = "ViEjA";
$texto = str_ireplace($busca , "<b>".$busca."</b>" , $texto);
echo $texto;
?>

Eso es lo que no quiero que ocurra.. que si busco Primerizo pero en la BD hay resultados que sean primerizo, pues que se sutituya por la original, por por la palabra que busco.

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #7 en: 30 de Julio de 2011, 01:42:34 am »
Error mio, no es stristr lo que debes usar, sino stripos
$pos = stripos($texto, $buscar);
y debería funcionar ;)

Saludos

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #8 en: 30 de Julio de 2011, 03:50:26 am »
Funciona de lujo westwest. Gracias de nuevo...
Pero tengo un problema, me busca todas las palabras que quiero y tal excepto si es la primera palabra o la última (creo que debe ser por las expresiones regulares o algo así).
El caso es que lo tengo así:

Citar

   $query 
mysql_query("SELECT * FROM noticias WHERE texto LIKE &#39;%".$busqueda."%&#39; OR titulo LIKE &#39;%".$busqueda."%&#39; ");
   if(
mysql_num_rows($query)){
	
  echo&
#39;<h2>Mostrando resultados de: &#39;.$busqueda.&#39;</h2>&#39;; 
   
while ($noticia mysql_fetch_array($query)) {
	
 
$comments mysql_query("SELECT * FROM `comments` WHERE para=&#39;".$noticia[&#39;id&#39;]."&#39;");
	
 
	
 if(
stripos($noticia[&#39;texto&#39;], $busqueda)==FALSE){
	
  
$texto=$noticia[&#39;texto&#39;];
	
 }else{
	
 
$pos stripos($noticia[&#39;texto&#39;], $busqueda);
	
 
$textosubstr($noticia[&#39;texto&#39;], ($pos-5), 5).
	
 &
#39;<b>&#39;.
	
 
substr($noticia[&#39;texto&#39;], $pos, strlen($busqueda)).
	
 &
#39;</b>&#39;.
	
 
substr($noticia[&#39;texto&#39;], ($pos+strlen($busqueda)), 5);
	
 }
	
 
	
 if(
stripos($noticia[&#39;titulo&#39;], $busqueda)==FALSE){
	
  
$titulo=$noticia[&#39;titulo&#39;];
	
 }else{
	
  
$pos2=stripos($noticia[&#39;titulo&#39;], $busqueda);
	
  
$len=strlen($busqueda);
	
  
$len2=strlen($noticia[&#39;titulo&#39;]);
	
  
$titulosubstr($noticia[&#39;titulo&#39;], (0), $pos2).
	
  &
#39;<u>&#39;.
	
  
substr($noticia[&#39;titulo&#39;], $pos2, strlen($busqueda)).
	
  &
#39;</u>&#39;.
	
  
substr($noticia[&#39;titulo&#39;], ($pos2+strlen($busqueda)), $len2-$pos2-$len);
	
 }
	
 
	
 
echo&
#39;<h4><a href="index.php?pag=Ver&ID=&#39;.$noticia[&#39;id&#39;].&#39;">&#39;.$titulo.&#39;</a></h4>
<p>&#39;.$texto.&#39;</p>&#39;; 
//while
}else{ //num_rows
  
echo "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda";
}


¿Alguna idea de cómo solucionarlo?
Gracias a todos ;)

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #9 en: 30 de Julio de 2011, 16:18:11 pm »
Funciona de lujo westwest. Gracias de nuevo...
Pero tengo un problema, me busca todas las palabras que quiero y tal excepto si es la primera palabra o la última (creo que debe ser por las expresiones regulares o algo así).
El caso es que lo tengo así:

¿Alguna idea de cómo solucionarlo?
Gracias a todos ;)

Qué raro, debería funcionar incluso estando al principio o al final, al fin y al cabo, el % coincide con cualquier caracter e incluso ninguno... ¿Seguro de que haces la busqueda correctamente? ¿No selecciona nada la query o no lo muestra el script?

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #10 en: 30 de Julio de 2011, 16:29:32 pm »
No, no lo selecciona la query... pero sin embargo introduzco esa query en en panel de phpmyadmin y si me la ejecuta.

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #11 en: 30 de Julio de 2011, 17:32:19 pm »
Es decir, que devuelve "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda"?

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #12 en: 30 de Julio de 2011, 17:47:56 pm »
parece que eso lo he arreglado, ahora queda la otra opción que dijiste, no se resalta.
(:
Gracias

P.D: Parece ser que solo pasa ahora con la primera palabra del titulo y del texto. No se resaltan.

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #13 en: 30 de Julio de 2011, 18:21:52 pm »
Prueba a utilizar en vez de
 if(stripos($noticia['texto'], $busqueda)==FALSE){
esto:
 if(stripos($noticia['texto'], $busqueda)===FALSE){

E igual con la otra comparación. Lo de usar el triple igual es porque puede que interprete el 0 (la posición que devuelve si está al inicio) como false.

Saludos

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:Resaltar palabras de busqueda especial
« Respuesta #14 en: 30 de Julio de 2011, 20:36:04 pm »
Creo que en otras ocasiones ya había comentado que eras mi héroe.. pero bueno, me reitero ^^
Muchas gracias !

Y bueno, ya la última cosa y seré feliz por un tiempo (:

En la busqueda de más de un caracter (el MATCH AGAINST) no me resalta absolutamente nada (ni del texto ni del titulo).
¿Alguna idea del por qué?

Citar

} elseif ($numero>1) { 
   
$query mysql_query("SELECT *, MATCH (titulo, texto)
AGAINST ( &#39;%"
.$nbusqueda."%&#39; ) FROM noticias WHERE
MATCH (titulo, texto) AGAINST ( &#39;%"
.$nbusqueda."%&#39; IN
BOOLEAN MODE ) LIMIT 15"
);
   if(
mysql_num_rows($query)){
	
  echo&
#39;<h2>Mostrando resultados de:<br><h3>&#39;.$busqueda.&#39;</h2>&#39;; 
   
while ($noticia mysql_fetch_array($query)) {
	
 
$comments mysql_query("SELECT * FROM `comments` WHERE para=&#39;".$noticia[&#39;id&#39;]."&#39;");
	
 
	
 if(
stripos($noticia[&#39;texto&#39;], $busqueda)===FALSE){
	
  
$texto=$noticia[&#39;texto&#39;];
	
 }else{
	
 
$pos stripos($noticia[&#39;texto&#39;], $busqueda);
	
 
$textosubstr($noticia[&#39;texto&#39;], ($pos-5), 5).
	
 &
#39;<b>&#39;.
	
 
substr($noticia[&#39;texto&#39;], $pos, strlen($busqueda)).
	
 &
#39;</b>&#39;.
	
 
substr($noticia[&#39;texto&#39;], ($pos+strlen($busqueda)), 5);
	
 }
	
 
	
 if(
stripos($noticia[&#39;titulo&#39;], $busqueda)===FALSE){
	
  
$titulo=$noticia[&#39;titulo&#39;];
	
 }else{
	
  
$pos2=stripos($noticia[&#39;titulo&#39;], $busqueda);
	
  
$len=strlen($busqueda);
	
  
$len2=strlen($noticia[&#39;titulo&#39;]);
	
  
$titulosubstr($noticia[&#39;titulo&#39;], (0), $pos2).
	
  &
#39;<u>&#39;.
	
  
substr($noticia[&#39;titulo&#39;], $pos2, strlen($busqueda)).
	
  &
#39;</u>&#39;.
	
  
substr($noticia[&#39;titulo&#39;], ($pos2+strlen($busqueda)), $len2-$pos2-$len);
	
 }
	
 
	
 
//$texto=resaltar($busqueda,$noticia[&#39;texto&#39;]);
	
 
//$titulo=resaltar($busqueda,$noticia[&#39;titulo&#39;]);
	
 
echo&
#39;<h4><a href="index.php?pag=Ver&ID=&#39;.$noticia[&#39;id&#39;].&#39;">&#39;.$titulo.&#39;</a></h4>
<p>&#39;.$texto.&#39;</p>&#39;; 
//while
}else{ //num_rows
  
echo "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda";
}
  }