CelulaWeb

Resaltar palabras en una búsqueda a MySQL

Resaltar palabras en una búsqueda a MySQL

El día de ayer se me ocurrió realizar un script para hacer búsquedas en una tabla de MySQL que permitiera resaltar las palabras ingresadas, algo parecido a lo que hacen Google y otros búscadores y pues empecé a buscar algo de información para llevarlo a cabo, sin resultados satisfactorios, claro, quizás no sea muy bueno buscando cosas, lo acepto, pero de tanto buscar me aburrí y empecé a hacer uno por mi cuenta, logré conseguir hacer algo, pero no funcionaba al 100% es decir que cuando realizaba una búsqueda me resaltaba las palabras escritas exactamente igual a como lo había escrito en el formulario de búsqueda.

Muchos expertos al leer este artículo -si es que lo llegaran a leer- dirán, pero porqué no usar la función str_ireplace() de PHP para hacerlo si esta función como lo dice el manual "devuelve una cadena o una matriz con todas las ocurrencias de busqueda en asunto (ignorando mayúsculas y minúsculas) sustituidas por el reemplazo dado". Sí, es verdad pero esa función sólo está disponible para PHP5 y mis proyectos corren en un servidor externo con PHP 4.x y pues tuve que ingeniármelas y crear una función para lograr lo que quería. Fue así que entré en ForosdelWeb.com una comunidad de desarrolladores web en la que frecuento y expuse mi duda, ahí surgió un usuario de nick panino5001 a quien también conozco de la web PHP-Hispano.NET y me ayudó a optimizar la función de resaltado de texto para obtener lo que quería con este script que ahora lo pongo a disposición de aquellos que también se encuentran buscando algo parecido.

<?php
    
include('bdconex.php'); // Este archivo contiene los datos de conexión a MySQL
    
    // Creamos una función que resaltará todas las palabras que coincidan con la búsqueda realizada. Gracias a panino5001 de forosdelweb.com por ayudarme a optimizarla
    
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 "nombre_tabla"// aquí pones el nombre de la tabla a la que deseas consultar
            
$campo "nombre_campo"// aquí pones el nombre del campo de la tabla a la que deseas consultar
            
            // 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 enviada
            
$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"];
?>            
                <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
    
}
?>

Ahí lo tienen, lo que hace el script es realizar una búsqueda a una tabla y campo determinados y devolver los resultados encontrados con las palabras ingresadas resaltadas en negrita(también se le puede colorear) de una manera similar a los resultados de Google, es lógico que este script se puede mejorar, pero tal como está ahora funciona muy bien, agradezco nuevamente a panino5001(Forosdelweb.com) o panino(PHP-Hispano.NET) por ayudarme a optimizar la función de resaltado de texto, te pasaste brother!.

Comentarios

  • Adex dijo:
  • el 31 de Ago. del 2007 a las 09:23

Gracias maestro por este material, ami me sirve a chorros la neta.. no se como agradecerte ya me daré un tiempo para escrbirte un MP

Saludos y gracias nuevamente....!!!

  • damian dijo:
  • el 31 de Ago. del 2007 a las 20:51

esto no es lo mimso ??


for($result->MoveFirst();!$result->eof;$result->MoveNext()){
$i++;
if($result->field('rslt')!=0){
$resumen[$i]=$result->field('notResumen');
for($a=0;$a<count($Busqueda);$a++){
$resumen[$i]=str_replace(strtolower($Busqueda[$a]),"<span class=\"busqueda\">".ucfirst($Busqueda[$a])."</span>",strtolower($resumen[$i]));
}

Como hago tengo problemas ya que mi motor de busquedas debe ser con acentos y no logro que la funcion las relaciones ejemplo América, america dice que son palabras distintas como hago yo estoy usando la funcion FULLTEXT de mysql que me permite buscar sin tomar encuenta los acentos por ende no tengo problemas

  • claudio dijo:
  • el 12 de Jul. del 2009 a las 10:34

Muy bueno el tuto!!!

  • ivanb dijo:
  • el 16 de Abr. del 2012 a las 11:15

Pork me salen puros puntos en lugar de las palabras???? ayudame please..!!!!

Comentar