cómo resaltar los resultados de búsqueda
Hola, tengo una función de búsqueda en la que buscaré palabras clave en una base de datos. Me gustaría resaltar las palabras clave y encontré una segunda función que me gustaría implementar en mi función de búsqueda.
Así que tengo este código para la búsqueda:
<code><?php function searchText($keywords){ global $db; $returned_results = array(); $where2 = ""; $keywords = preg_split('/[\s]+/', $keywords); $total_keywords = count($keywords); foreach ($keywords as $key=>$keyword){ $where2 .= "`column` LIKE '%$keyword%'"; if ($key != ($total_keywords - 1)){ $where2 .= " OR "; } } $results_text = "SELECT `a`, `b`, LEFT(`c`, 150) as `c` FROM `table` WHERE $where2"; $results_num_text = ($query2 = mysqli_query($db, $results_text)) ? mysqli_num_rows($query2) : 0; if ($results_num_text === 0){ return false; } else { while ($row = mysqli_fetch_assoc($query2)){ $returned_results[] = array( 'ab' => $row['ab'], 'cd' => $row['cd'], ); } return $returned_results; } } ?> </code>
y me gustaría implementar una segunda función en ella:
<code><?php function mark_words ($text, $words, $colors = false) { if (!$colors || !is_array($colors) ) { $colors = array('#ff9999', '#ffff99', '#ff99ff', '#99ffff','#99ff99'); } $c = 0; foreach ($words as $w) { $w = preg_quote(trim($w)); if($w=='') { continue; } $regexp = "/($w)(?![^<]+>)/i"; $replacement = '<b style="background-color:'.$colors[$c].'">\\1</b>'; $text = preg_replace ($regexp,$replacement ,$text); $c++; if ($c >= count($colors)) { $c=0; } } return $text; } $example = <<< EOT some text is here inside EOT; $search = array('some','is', 'inside'); echo mark_words($example, $search); ?> </code>
así que tengo este código que no funciona:
<code><?php function searchText($keywords, $colors = false){ global $db; if (!$colors || !is_array($colors) ) { $colors = array('#ff9999', '#ffff99', '#ff99ff', '#99ffff','#99ff99'); } $c = 0; $returned_results = array(); $where2 = ""; $keywords = preg_split('/[\s]+/', $keywords); $total_keywords = count($keywords); foreach ($keywords as $key=>$keyword){ $regexp = "/($w)(?![^<]+>)/i"; $replacement = '<b style="background-color:'.$colors[$c].'">\\1</b>'; $text = preg_replace($regexp,$replacement ,$keywords); $c++; if ($c >= count($colors)) { $c=0; } $where2 .= "`b` LIKE '%$keyword%'"; if ($key != ($total_keywords - 1)){ $where2 .= " OR "; } } $results_text = "SELECT `a`, LEFT(`b`, 150) as `b`, `c` FROM `table` WHERE $where2"; $results_num_text = ($query2 = mysqli_query($db, $results_text)) ? mysqli_num_rows($query2) : 0; if ($results_num_text === 0){ return false; } else { while ($row = mysqli_fetch_assoc($query2)){ $returned_results[] = array( 'ab' => $row['a'], 'cd' => $row['b'], ); } return $returned_results; $highlight = array($keywords); echo mark_words($highlight); } } ?> </code>
Como lo busqué, cómo hacerlo encontré dos posibilidades. la primera sería una función, la segunda sería resaltarla directamente desde la consulta de selección:
<code>SELECT REPLACE(`col`, 'foobar', '<span class="highlight">foobar</span>') AS `formated_foobar` FROM … WHERE `col` LIKE "%foobar%" </code>
así que mi pregunta es ¿cómo puedo implementar la segunda función en la función de búsqueda o sería mejor usar el segundo método?
Si hubiera alguien que pudiera ayudarme, realmente lo apreciaría. muchas gracias.