2010-05-28 3 views
0

Я не уверен, как лучше сформулировать заголовок лучше, но моя проблема заключается в том, что функция выделения не выделяет ключевые слова для поиска, которые находятся в конце слова. например, если ключевое слово поиска «я», оно будет выделять «я» или «самооценку» или «я» [с капиталом 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

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

+0

Вы имеете в виду, что это должно быть '$ re = '~ \ ('. Implode ('|', $ m [0]). ') ~ I';' – input

+0

да, насколько я могу сказать просто глядя на ваш код. – Tesserex

+0

спасибо, он работает по мере необходимости. – input

0

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

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 

цикла, это так, что каждый поиск слово цитироваться ...

EDIT: Модифицированная функция взять либо строку или массив в $words параметра.

Смежные вопросы