La gente no lo suele implementar en los buscadores pero siempre queda bien hacer que cuando se busca por palabras sueltas y mete varias entre comillas se haga la búsqueda por esas exactas. Por ejemplo si buscamos gatos «bosque siberiano» lo suyo es que haga la consulta:
Where campo like '%gatos%' or campo like '%bosque siberiano%'
Lo primero es la consulta, aunque es un poco más lenta, pero es más sencillo construirla con una expresión regular:
Where campo REGEXP '(gatos|bosque siberiano)'
Y para construir la cadena a ejecutar:
// cargamos en un array las palabras entre comillas
preg_match_all('/".*?"/', $_POST["search"], $matches);
foreach ($matches[0] as $value) {
// las palabras encontradas las borramos de la cadena original
$_POST["search"] = str_replace($value, '', $_POST["search"]);
}
// cargamos en un array las palabras sueltas que no estaban entre comillas y las unimos a las que si lo estaban
$palabras = array_merge(explode(' ', $_POST["search"]), $matches[0]);
// eliminamos todos los posibles elementos vacios del array
$palabras = array_filter($palabras, function($value) { return $value !== ''; });
// y los unimos con el separador | que vamos a usar en la consulta
$cadena = str_replace('"', '', implode('|', $palabras));
// y ya tenemos el where
$where .= sprintf(" campo REGEXP '(%s)'", mysql_escape_string($cadena));
0 Comentarios.