how to highlight search results
function, html, mysql, php, syntax-highlighting
Solution
You shouldn't make it too hard for yourself. All you need it to replace every occurrence of a word with the word wrapped in the span with the required style applied. This should work for you:
function highlight_word( $content, $word, $color ) {
$replace = '<span style="background-color: ' . $color . ';">' . $word . '</span>'; // create replacement
$content = str_replace( $word, $replace, $content ); // replace content
return $content; // return highlighted data
}
function highlight_words( $content, $words, $colors ) {
$color_index = 0; // index of color (assuming it's an array)
// loop through words
foreach( $words as $word ) {
$content = highlight_word( $content, $word, $colors[$color_index] ); // highlight word
$color_index = ( $color_index + 1 ) % count( $colors ); // get next color index
}
return $content; // return highlighted data
}
// words to find
$words = array(
'normal',
'text'
);
// colors to use
$colors = array(
'#88ccff',
'#cc88ff'
);
// faking your results_text
$results_text = array(
array(
'ab' => 'AB #1',
'cd' => 'Some normal text with normal words isn\'t abnormal at all'
), array(
'ab' => 'AB #2',
'cd' => 'This is another text containing very normal content'
)
);
// loop through results (assuming $output1 is true)
foreach( $results_text as $result ) {
$result['cd'] = highlight_words( $result['cd'], $words, $colors );
echo '<fieldset><p>ab: ' . $result['ab'] . '<br />cd: ' . $result['cd'] . '</p></fieldset>';
}
Using Regular Expressions to replace content would do as well, though using `str_replace()` is a bit faster.
The functions accepts these arguments:
`highlight_word( string, string, string );`
`highlight_words( string, array, array );`
The above example results in:
Problem
hello i have a search function in that i will search a db for keywords. i would like to highlight the keywords and found a second function that i would like to implement into my search function. so i have this code for the search: ``` <?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; } } ?> ``` and would like to implement a second function into it: ``` <?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); ?> ``` so i have this code that doesnt work: ``` <?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); } } ?> ``` as i looked for it how to do so i found two possibilities. the first would be a function the second would be directly to highlight it from the select query: ``` SELECT REPLACE(`col`, 'foobar', '<span class="highlight">foobar</span>') AS `formated_foobar` FROM … WHERE `col` LIKE "%foobar%" ``` so my question is how can i implement the second function into the search function or would it be better to use the second method? if there is someone who could help me i really would appreciate. thanks a lot.