Foros del Web » Programando para Internet » PHP »

Remarcar palabras en una búsqueda

Estas en el tema de Remarcar palabras en una búsqueda en el foro de PHP en Foros del Web. Hola amigos, tengo creado un script sencillo para realizar búsquedas que tiene la opción de resaltar en negrita las palabras que se ingresaron en el ...
  #1 (permalink)  
Antiguo 04/05/2007, 18:52
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Remarcar palabras en una búsqueda

Hola amigos, tengo creado un script sencillo para realizar búsquedas que tiene la opción de resaltar en negrita las palabras que se ingresaron en el formulario, el script es este:

Código PHP:
<?php
    
include('bdconex.php');
    function 
resaltar($palabras$texto) {
        
$cambia = array();
        for(
$i=0$i count($palabras); $i++) {
            
$cambia "<strong>".$palabras[$i]."</strong>";
        }
        return 
str_replace($palabras$cambia$texto);
    }
    if (isset(
$_POST["buscar"])) {
        if(
$_POST['palabra'] == '') {
            echo 
"No has ingresado ninguna palabra a buscar <a href='javascript:history.back()'>Regresar</a>";
        }else {
            
$tabla "noticias";
            
$campo "titulo";
            
$palabra stripslashes($_POST['palabra']);
            
$palabra strip_tags($palabra);
            
$query mysql_query("SELECT * FROM $tabla WHERE $campo LIKE '%".$palabra."%'");
            
$mostrar mysql_num_rows($query);
            if(
mysql_num_rows($query) == "0") {
                echo 
"No hay coincidencias encontradas para <strong>".$palabra."</strong> <a href='javascript:history.back()'>Regresar</a>";
            }else {
?>
                Se han encontrado <strong><?=$mostrar?></strong> coincidencias para <strong><?=$palabra?></strong>
<?php            
                
while($datos mysql_fetch_array($query)) {        
                    
$texto $datos["titulo"];
                    
$pal = array($palabra);
?>            
                <ul>
                    <li><?=resaltar($pal$texto)?></li>
                </ul>
<?php
                
}
            }
        }
    }else {
?>
    <form action="buscar.php" method="post">
        <input name="palabra" type="text" />
        <input name="buscar" type="submit" value="Enviar" />
    </form>
<?php
    
}
?>
Las búsquedas funcionan correctamente, salvo una cosa, que sólo resalta las palabras que coincidan exactamente con la que se envió en el formulario, por ejemplo si yo ingreso youtube al mostrarme los resultados de la búsqueda únicamente aparecen en negrita las palabras que estén escritas igual que como se envió en el formulario y si en los resultados está YouTube pues no la resalta, alguno de ustedes sabrá como solucionar ese detalle?, gracias de antemano.

Saludos
  #2 (permalink)  
Antiguo 04/05/2007, 21:50
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 19 años, 2 meses
Puntos: 49
Re: Remarcar palabras en una búsqueda

no se a mi se me ocurre que podrias hacer un strtolower($cadena); o un strtoupper($cadena); conviertiendo la cadena en mayusculas o minusculas como quieras y lo comparas con lo mismo minusculas o mayusculas, no se si esta dentro de tus posibilidades pero es lo que se me ocurre ahora :P, o sea conviertes tu texto de ingreso por ej todo a minusculas con strtolower($cadena); y lo comparas con lo mismo de la base de datos y muestras :)

saludos
__________________
Gokuh Salvo al mundo. PUNTO!!!!
  #3 (permalink)  
Antiguo 04/05/2007, 22:47
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

Pues la verdad no te entendí muy bien, te agradecería si me lo explicaras con algunas líneas de código, talvez así pueda captar mejor la idea
  #4 (permalink)  
Antiguo 04/05/2007, 23:00
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 19 años, 2 meses
Puntos: 49
Re: Remarcar palabras en una búsqueda

haber cuando envias tu input recibes con

$_POST[palabra]; cierto pues a eso le aplicas strtolower($cadena);
que convierte esa cadena a minusculas... demodo de

$palabra_m = strtolower($_POST[palabra]);

siendo $palabra_m tu variable con la palabra en minuscula o sea si el usuario pone YoUtuBe o youtube o YOUTUBE etc.. como quiera siempre devolvera youtube....

pues asi mismo lo haces para tu select compruebas minusculas con minusculas, y traes la info :) y pones en negrita las que sean iguales :D
__________________
Gokuh Salvo al mundo. PUNTO!!!!
  #5 (permalink)  
Antiguo 04/05/2007, 23:12
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

a ver, según lo que te entendí es que si el usuario inserta una palabra ya sea todas en minusculas o en mayusculas o como sea, con la funcion strtolower la convertirá en minusculas y al hacer el select me mostrará en negrita las que sean iguales o sea, sólo las que están en minúsculas?, por ejemplo si en la BD hay esto: youtube, YouTube, YOUTUBE, etc. sólo pondrá en negrita la que sea youtube y las demás no?
  #6 (permalink)  
Antiguo 04/05/2007, 23:19
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 19 años, 2 meses
Puntos: 49
Re: Remarcar palabras en una búsqueda

la idea es que coviertas en minusculas el texto introducido por el usuario y el texto que recuperas de la base de datos, tonces si el usuario ingrese lo que ingrese lo convertira a minusculas, y de la base de datos te traes todo tambien en minusculas con el mismo metodo y luego compraras y pones en negrita :D
__________________
Gokuh Salvo al mundo. PUNTO!!!!
  #7 (permalink)  
Antiguo 04/05/2007, 23:26
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

pues justamente es eso lo que hace el script así como está, aunque claro yo obvié lo de la funcion strtolower porque quería que me devuelva los resultados tal y como están en la BD y que remarque en negrita todas las palabras que coincidan con la que ingresó el usuario sin importar que sean mayusculas, minusculas, algo así como google, no sé si me entiendas.
  #8 (permalink)  
Antiguo 05/05/2007, 11:08
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Remarcar palabras en una búsqueda

Probá esto (te repito la rta aquí por las dudas):
Código PHP:
<?php
if(!function_exists('str_ireplace')) {
function 
str_ireplace($search,$replace,$subject) {
$search preg_quote($search"/");
return 
preg_replace("/".$search."/i"$replace$subject); } } 

function 
resaltar($palabra$texto) {
        
$reemp=str_ireplace($palabra,'%s',$texto);
        
$ub=strpos($reemp,'%s');
        if(
$ub===false)return $texto;
        
$pal_original=substr($texto,$ub,strlen($palabra));
        return 
sprintf($reemp,'<strong>'.$pal_original.'</strong>');
    }
$str="Esto es una prueba de cómo se vería Youtube luego de aplicar la función";    
$test1=resaltar('YouTube'$str);
$test2=resaltar('Youtube'$str);
$test3=resaltar('youtube'$str);
echo 
$test1.'<br />'.$test2.'<br />'.$test3;
function 
palabraOriginal(){

}
?>
  #9 (permalink)  
Antiguo 05/05/2007, 11:19
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

Hola panino, añadí la función que pusiste en el script pero sigue sin funcionar, ahora ya no resalta nada, mira aquí dejo el script.

Código PHP:
<?php
    
include('bdconex.php'); // Este archivo contiene los datos de conexión a la BD
    
    // creamos una función que resaltará todas las palabras que coincidan con la búsqueda realizada
    
if(!function_exists('str_ireplace')) {
    function 
str_ireplace($search,$replace,$subject) {
    
$search preg_quote($search"/");
    return 
preg_replace("/".$search."/i"$replace$subject); } }
    
    function 
resaltar($palabra$texto) {
        
$reemp=str_ireplace($palabra,'%s',$texto);
        
$ub=strpos($reemp,'%s');
        if(
$ub===false)return $texto;
        
$pal_original=substr($texto,$ub,strlen($palabra));
        return 
sprintf($reemp,'<strong>'.$pal_original.'</strong>');
    }
    
    
// iniciamos el proceso de búsqueda
    
if (isset($_POST["buscar"])) {
        if(
$_POST['palabra'] == '') {
            echo 
"No has ingresado ninguna palabra a buscar <a href='javascript:history.back()'>Regresar</a>";
        }else {
            
$tabla "noticias";
            
$campo "titulo";
            
            
// quitamos cualquier código malicioso de $_POST['palabra']
            
$palabra stripslashes($_POST['palabra']);
            
$palabra strip_tags($palabra);
            
            
// hacemos la consulta a la base de datos según la palabra encontrada
            
$query mysql_query("SELECT * FROM $tabla WHERE $campo LIKE '%".$palabra."%'");
            
$mostrar mysql_num_rows($query); // obtenemos la cantidad de coincidencias encontradas
            
if(mysql_num_rows($query) == "0") {
                echo 
"No hay coincidencias encontradas para <strong>".$palabra."</strong> <a href='javascript:history.back()'>Regresar</a>";
            }else {
?>
                Se han encontrado <strong><?=$mostrar?></strong> coincidencias para <strong><?=$palabra?></strong>
<?php            
                
while($datos mysql_fetch_array($query)) {        
                    
$str $datos["titulo"];
                    
$pal = array($palabra);
?>            
                <ul>
                    <li><?=resaltar($pal$str)?></li>
                </ul>
<?php
                
}
            }
        }
    }else {
?>
    <form action="buscar.php" method="post">
        <input name="palabra" type="text" />
        <input name="buscar" type="submit" value="Enviar" />
    </form>
<?php
    
}
?>
No sé donde puede estar el fallo. gracias por tu ayuda.

Saludos.
  #10 (permalink)  
Antiguo 05/05/2007, 11:25
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Remarcar palabras en una búsqueda

Para qué hacés esto: $pal = array($palabra);
  #11 (permalink)  
Antiguo 05/05/2007, 11:35
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

eso lo puse para que se forme un array de toda la cadena ingresada por ejemplo "google compra youtube" para que cuando se haga la busqueda la función resaltar resalte las coincidencias con esa cadena ingresada, algo parecido a lo que hace google en sus búsquedas, no sé si me dejo entender.

y si quito esa línea me devuelve tantos errores como resultados tenga la búsqueda, el mensaje de error es este:

Warning: sprintf(): Too few arguments in /home/chs/canalchiclayo.org/home/html/buscar.php on line 15
  #12 (permalink)  
Antiguo 05/05/2007, 11:42
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Remarcar palabras en una búsqueda

A ver, probá esto:
Código PHP:
<?php
    
include('bdconex.php'); // Este archivo contiene los datos de conexión a la BD
    
    // creamos una función que resaltará todas las palabras que coincidan con la búsqueda realizada
    
if(!function_exists('str_ireplace')) {
    function 
str_ireplace($search,$replace,$subject) {
    
$search preg_quote($search"/");
    return 
preg_replace("/".$search."/i"$replace$subject); } }
    
    function 
resaltar($palabra$texto) {
        
$reemp=str_ireplace($palabra,'%s',$texto);
        
$ub=strpos($reemp,'%s');
        if(
$ub===false)return $texto;
        
$pal_original=substr($texto,$ub,strlen($palabra));
        return 
sprintf($reemp,'<strong>'.$pal_original.'</strong>');
    }
    
    
// iniciamos el proceso de búsqueda
    
if (isset($_POST["buscar"])) {
        if(
$_POST['palabra'] == '') {
            echo 
"No has ingresado ninguna palabra a buscar <a href='javascript:history.back()'>Regresar</a>";
        }else {
            
$tabla "noticias";
            
$campo "titulo";
            
            
// quitamos cualquier código malicioso de $_POST['palabra']
            
$palabra stripslashes($_POST['palabra']);
            
$palabra strip_tags($palabra);
            
            
// hacemos la consulta a la base de datos según la palabra encontrada
            
$query mysql_query("SELECT * FROM $tabla WHERE $campo LIKE '%".$palabra."%'");
            
$mostrar mysql_num_rows($query); // obtenemos la cantidad de coincidencias encontradas
            
if(mysql_num_rows($query) == "0") {
                echo 
"No hay coincidencias encontradas para <strong>".$palabra."</strong> <a href='javascript:history.back()'>Regresar</a>";
            }else {
?>
                Se han encontrado <strong><?=$mostrar?></strong> coincidencias para <strong><?=$palabra?></strong>
<?php            
                
while($datos mysql_fetch_array($query)) {        
                    
$str $datos["titulo"];
                    
//$pal = array($palabra);
?>            
                <ul>
                    <li><?=resaltar($palabra$str)?></li>
                </ul>
<?php
                
}
            }
        }
    }else {
?>
    <form action="buscar.php" method="post">
        <input name="palabra" type="text" />
        <input name="buscar" type="submit" value="Enviar" />
    </form>
<?php
    
}
?>
  #13 (permalink)  
Antiguo 05/05/2007, 11:57
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

lo he probado, y funciona regular, es decir, si por ejemplo en el título de una noticia la palabra aparece repetida más de una vez muestra los resultados resaltados sin importar como esté escrito y en la línea donde debe aparecer el título con la palabra repetida muestra un warning:

Warning: sprintf(): Too few arguments in /home/chs/canalchiclayo.org/home/html/buscar.php on line 15

A qué crees que se deba?
  #14 (permalink)  
Antiguo 05/05/2007, 12:16
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Remarcar palabras en una búsqueda

En ese caso, para no complicar las cosas, podrías probar así:
Código PHP:
<?php
    
include('bdconex.php'); // Este archivo contiene los datos de conexión a la BD
    
    // creamos una función que resaltará todas las palabras que coincidan con la búsqueda realizada
    
if(!function_exists('str_ireplace')) {
    function 
str_ireplace($search,$replace,$subject) {
    
$search preg_quote($search"/");
    return 
preg_replace("/".$search."/i"$replace$subject); } }
    
    function 
resaltar($palabra$texto) {
         return 
str_ireplace($palabra,'<strong>'.$palabra.'</strong>',$texto);
    }
    
    
// iniciamos el proceso de búsqueda
    
if (isset($_POST["buscar"])) {
        if(
$_POST['palabra'] == '') {
            echo 
"No has ingresado ninguna palabra a buscar <a href='javascript:history.back()'>Regresar</a>";
        }else {
            
$tabla "noticias";
            
$campo "titulo";
            
            
// quitamos cualquier código malicioso de $_POST['palabra']
            
$palabra stripslashes($_POST['palabra']);
            
$palabra strip_tags($palabra);
            
            
// hacemos la consulta a la base de datos según la palabra encontrada
            
$query mysql_query("SELECT * FROM $tabla WHERE $campo LIKE '%".$palabra."%'");
            
$mostrar mysql_num_rows($query); // obtenemos la cantidad de coincidencias encontradas
            
if(mysql_num_rows($query) == "0") {
                echo 
"No hay coincidencias encontradas para <strong>".$palabra."</strong> <a href='javascript:history.back()'>Regresar</a>";
            }else {
?>
                Se han encontrado <strong><?=$mostrar?></strong> coincidencias para <strong><?=$palabra?></strong>
<?php            
                
while($datos mysql_fetch_array($query)) {        
                    
$str $datos["titulo"];
                    
//$pal = array($palabra);
?>            
                <ul>
                    <li><?=resaltar($palabra$str)?></li>
                </ul>
<?php
                
}
            }
        }
    }else {
?>
    <form action="buscar.php" method="post">
        <input name="palabra" type="text" />
        <input name="buscar" type="submit" value="Enviar" />
    </form>
<?php
    
}
?>
La desventaja es que no se conserva el formato original de la cadena. Igual, se podría modificar la otra función para que haga todos los reemplazos manteniendo la palabra en el formato original, sólo que ahora no tengo tiempo como para ver cómo lograrlo ;)
  #15 (permalink)  
Antiguo 05/05/2007, 12:53
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

Cita:
La desventaja es que no se conserva el formato original de la cadena. Igual, se podría modificar la otra función para que haga todos los reemplazos manteniendo la palabra en el formato original, sólo que ahora no tengo tiempo como para ver cómo lograrlo ;)
Está bien panino, no hay apuro, gracias por tu ayuda
  #16 (permalink)  
Antiguo 05/05/2007, 14:43
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Remarcar palabras en una búsqueda

Creo que ahora sí va a servirte:
Código PHP:
<?php
    
include('bdconex.php'); // Este archivo contiene los datos de conexión a la BD
    
    // creamos una función que resaltará todas las palabras que coincidan con la búsqueda realizada
    
if(!function_exists('str_ireplace')) {
    function 
str_ireplace($search,$replace,$subject) {
    
$search preg_quote($search"/");
    return 
preg_replace("/".$search."/i"$replace$subject); } }
    
    function 
resaltar($palabra$texto) {
        
$aux=$reemp=str_ireplace($palabra,'%s',$texto);
        
$veces=substr_count($reemp,'%s');
        if(
$veces==0)return $texto;
        
$palabras_originales=array();
        for(
$i=0;$i<$veces;$i++){
              
$palabras_originales[]='<strong>'.substr($texto,strpos($aux,'%s'),strlen($palabra)).'</strong>';
              
$aux=substr($aux,0,strpos($aux,'%s')).$palabra.substr($aux,strlen(substr($aux,0,strpos($aux,'%s')))+2);
        }
        return 
vsprintf($reemp,$palabras_originales);
  } 
    
    
// iniciamos el proceso de búsqueda
    
if (isset($_POST["buscar"])) {
        if(
$_POST['palabra'] == '') {
            echo 
"No has ingresado ninguna palabra a buscar <a href='javascript:history.back()'>Regresar</a>";
        }else {
            
$tabla "noticias";
            
$campo "titulo";
            
            
// quitamos cualquier código malicioso de $_POST['palabra']
            
$palabra stripslashes($_POST['palabra']);
            
$palabra strip_tags($palabra);
            
            
// hacemos la consulta a la base de datos según la palabra encontrada
            
$query mysql_query("SELECT * FROM $tabla WHERE $campo LIKE '%".$palabra."%'");
            
$mostrar mysql_num_rows($query); // obtenemos la cantidad de coincidencias encontradas
            
if(mysql_num_rows($query) == "0") {
                echo 
"No hay coincidencias encontradas para <strong>".$palabra."</strong> <a href='javascript:history.back()'>Regresar</a>";
            }else {
?>
                Se han encontrado <strong><?=$mostrar?></strong> coincidencias para <strong><?=$palabra?></strong>
<?php            
                
while($datos mysql_fetch_array($query)) {        
                    
$str $datos["titulo"];
                    
//$pal = array($palabra);
?>            
                <ul>
                    <li><?=resaltar($palabra$str)?></li>
                </ul>
<?php
                
}
            }
        }
    }else {
?>
    <form action="buscar.php" method="post">
        <input name="palabra" type="text" />
        <input name="buscar" type="submit" value="Enviar" />
    </form>
<?php
    
}
?>
  #17 (permalink)  
Antiguo 05/05/2007, 14:58
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 9 meses
Puntos: 4
Re: Remarcar palabras en una búsqueda

Sí, ya está funcionando, me había matado buscando en algo parecido y no encontraba nada, así que me decidí a hacerlo por mi cuenta y con tu ayuda pude optimizar la función para que resalte las palabras buscadas. El script queda ahí para quien le pueda servir

Muchas gracias panino
  #18 (permalink)  
Antiguo 05/05/2007, 15:00
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Remarcar palabras en una búsqueda

Me alegra que te haya servido
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 12:59.