выделить несколько ключевых слов в поиске

Я использую этот код, чтобы выделить ключевые слова для поиска:

function highlightWords($string, $word) { $string = str_replace($word, "<span class='highlight'>".$word."</span>", $string); /*** return the highlighted string ***/ return $string; } .... $cQuote = highlightWords(htmlspecialchars($row['cQuotes']), $search_result); 

однако это выделяет только одно ключевое слово. если пользователь вводит более одного ключевого слова, он сужает поиск, но слово не выделяется. как я могу выделить более одного слова?

регулярные выражения – это путь!

 function highlight($text, $words) { preg_match_all('~\w+~', $words, $m); if(!$m) return $text; $re = '~\\b(' . implode('|', $m[0]) . ')\\b~'; return preg_replace($re, '<b>$0</b>', $text); } $text = ' Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. '; $words = 'ipsum labore'; print highlight($text, $words); 

Чтобы совместить регистр без учета регистра, добавьте 'i' в регулярное выражение

  $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i'; 

NB: для неглавных букв типа «ä» результаты могут различаться в зависимости от региона.

PHP> 5.3.0, попробуйте preg_filter ()

 /** * Highlighting matching string * @param string $text subject * @param string $words search string * @return string highlighted text */ public function highlight($text, $words) { $highlighted = preg_filter('/' . preg_quote($words) . '/i', '<b><span class="search-highlight">$0</span></b>', $text); if (!empty($highlighted)) { $text = $highlighted; } return $text; } 

Предполагая, что слова вводятся в виде разделенной пробелом строки, вы можете просто использовать взрыв

 $words = explode(' ', $term); 

Хотя, если вы хотите, чтобы не было нескольких пробелов, вы можете сначала удалить их из строки

 $term = preg_replace('/\s+/', ' ', trim($term)); $words = explode(' ', $term); 

Затем вам нужно создать заменяющий массив

 $highlighted = array(); foreach ( $words as $word ){ $highlighted[] = "<span class='highlight'>".$word."</span>" } 

затем

 str_replace($words, $highlighted, $string); 

Так что поставив его

 function highlightWords($string, $term){ $term = preg_replace('/\s+/', ' ', trim($term)); $words = explode(' ', $term); $highlighted = array(); foreach ( $words as $word ){ $highlighted[] = "<span class='highlight'>".$word."</span>" } return str_replace($words, $highlighted, $string); } 

здесь простая функция, чтобы выделить только текст соответствия.

 function highlighter_text($text, $words) { $split_words = explode( " " , $words ); foreach($split_words as $word) { $color = "#e5e5e5"; $text = preg_replace("|($word)|Ui" , "<span style=\"background:".$color.";\"><b>$1</b></span>" , $text ); } return $text; } 

функция вызова

Выделите несколько ключевых слов в поиске, включая umlauts

Я использовал регулярное выражение, написанное ранее, и заменил \w на [A-Za-z0-9_äöüÄÖÜ] . Как вы видите, я добавил äöüÄÖÜ . Я также удалил \b чтобы он соответствовал любому виду поискового запроса.

пример

искать термин:
Su shamp

текст:
Солнцезащитный шампунь

результат:
Su n блестящий шампунь


Код, который я использовал:

 private function getSearchTermToBold($text, $words) { preg_match_all('~[A-Za-z0-9_äöüÄÖÜ]+~', $words, $m); if (!$m) return $text; $re = '~(' . implode('|', $m[0]) . ')~i'; return preg_replace($re, '<b>$0</b>', $text); } 

как было предложено пользователем187291, просто измените следующий код, чтобы выделить текст с желтым фоном.

  return preg_replace($re, '<SPAN style="BACKGROUND-COLOR: #ffff00"><b>$0</b></SPAN>', $text); 

Разделите свой поисковый запрос на слова, затем выделите каждое слово отдельно.

Однако лучше выполнить подсветку в javascript. jQuery «содержит» селектор, вероятно, поможет избежать проблем с заменой элементов разметки, когда вы идете …

http://api.jquery.com/contains-selector/

Другие решения могут быть нечувствительны к регистру при поиске выделенных терминов, но не сохраняют их случай исходной строки. Поэтому поиск «st» найдет «ST», но выделит его как «st», поисковый запрос.

Я использую следующее. Сначала он формирует массив replace, а затем использует str_replace () с параметрами массива, что позволяет избежать рекурсии.

 function highlightStr($haystack, $needle, $highlightStyle) { if (strlen($highlightStyle) < 1 || strlen($haystack) < 1 || strlen($needle) < 1) { return $haystack; } preg_match_all("/$needle+/i", $haystack, $matches); $matches[0] = array_unique($matches[0]); if (is_array($matches[0]) && count($matches[0]) >= 1) { foreach ($matches[0] as $ii=>$match) $replace[$ii]="<span style='$highlightStyle'>$match</span>"; $haystack = str_replace($matches[0], $replace, $haystack); } return $haystack; }