выделение слов в конце слова - PullRequest
0 голосов
/ 28 мая 2010

Я не уверен, как бы я мог лучше сформулировать заголовок, но моя проблема в том, что функция подсветки не выделяет ключевые слова для поиска, которые находятся в конце слова. например, если ключевое слово для поиска - «я», оно будет выделять «я» или «самоуничижение» или «я» [с заглавной буквы S], но оно не будет выделять «я» или «себя» и т. д. .

это функция выделения:

function highlightWords($text, $words) {
    preg_match_all('~\w+~', $words, $m);
    if(!$m)
        return $text;
    $re = '~\\b(' . implode('|', $m[0]) . ')~i';
    $string = preg_replace($re, '<span class="highlight">$0</span>', $text);

    return $string;
}

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

Кажется, у вас может быть \b в начале вашего регулярного выражения, что означает слово границы Поскольку «я» в «себе» не начинается с границы слова, оно не совпадает. Избавьтесь от \b.

0 голосов
/ 28 мая 2010

Попробуйте что-то вроде этого:

function highlight($text, $words) {
    if (!is_array($words)) {
        $words = preg_split('#\\W+#', $words, -1, PREG_SPLIT_NO_EMPTY);
    }
    $regex = '#\\b(\\w*(';
    $sep = '';
    foreach ($words as $word) {
        $regex .= $sep . preg_quote($word, '#');
        $sep = '|';
    }
    $regex .= ')\\w*)\\b#i';
    return preg_replace($regex, '<span class="highlight">\\1</span>', $text);
}

$text = "isa this is test text";
$words = array('is');

echo highlight($text, $words);  // <span class="highlight">isa</span> <span class="highlight">this</span> <span class="highlight">is</span> test text

Цикл таков, что каждое поисковое слово правильно заключено в кавычки ...

РЕДАКТИРОВАТЬ: модифицированная функция для получения строки или массива в параметре $words.

...