jak podświetlić wyniki wyszukiwania
witam mam funkcję wyszukiwania, w której będę szukać db dla słów kluczowych. Chciałbym podkreślić słowa kluczowe i znaleźć drugą funkcję, którą chciałbym wprowadzić do mojej funkcji wyszukiwania.
więc mam ten kod do wyszukiwania:
<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>
i chciałbym zaimplementować w nim drugą funkcję:
<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>
więc mam ten kod, który nie działa:
<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>
jak szukałem tego, jak to zrobić, znalazłem dwie możliwości. pierwsza będzie funkcją, druga będzie bezpośrednio podświetlać ją z kwerendy wyboru:
<code>SELECT REPLACE(`col`, 'foobar', '<span class="highlight">foobar</span>') AS `formated_foobar` FROM … WHERE `col` LIKE "%foobar%" </code>
więc moje pytanie brzmi: jak mogę zaimplementować drugą funkcję w funkcji wyszukiwania, czy lepiej byłoby użyć drugiej metody?
Gdyby był ktoś, kto mógłby mi pomóc, naprawdę byłbym wdzięczny. wielkie dzięki.