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

я использую этот код для выделения поисковых ключевых слов:

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);

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

7
задан input 3 May 2010 в 11:20
поделиться

3 ответа

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

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: для неанглийских букв, таких как «ä», результаты могут отличаться в зависимости от локали.

25
ответ дан 6 December 2019 в 04:47
поделиться

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

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

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

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

Затем вам нужно сгенерировать replace array

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

Then

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);
}
6
ответ дан 6 December 2019 в 04:47
поделиться

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

Возможно, лучше будет выполнить выделение в javascript. Селектор "содержит" в jQuery, вероятно, поможет избежать проблем с заменой элементов разметки по ходу ...

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

0
ответ дан 6 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: