Resaltar palabras en una búsqueda a MySQL
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!.


























