2013-07-02 3 views
0

Я использую следующую функцию, чтобы выделить искомые ключевые слова из строки. Он работает нормально, но у него мало проблем.выделить только набранные ключевые слова из строки в php

$text="This is simple test text"; 
$words="sim text"; 
echo highlight($text, $words); 

Используя следующую функцию, которую он выдвигает на первый план как «простые» & «текст» слова, где я хочу его следует выделить «сим» & «текст» только слова. Какие изменения я должен внести для достижения этого результата. Пожалуйста, порекомендуйте.

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="SuccessMessage">\\1</span>', $text); 
} 
+0

чем причина вы используете '\\ b',' \\ w' и '\\ W' вместо просто' \ b', '\ w' и' \ W'? – h2ooooooo

+0

Это дает тот же результат в обоих случаях. Пожалуйста, порекомендуйте. – KRA

+0

@KRA, какой вывод вы хотите точно для ввода образца? – Dogbert

ответ

1

Для этого вам необходимо собрать все соответствующие тексты в группы.

Полный код: (я пометил строки, которые я изменил.)

$text="This is simple test text"; 
$words="sim text"; 
echo highlight($text, $words); 

function highlight($text, $words) 
{ 
    if (!is_array($words)) 
    { 
     $words = preg_split('#\\W+#', $words, -1, PREG_SPLIT_NO_EMPTY); 
    } 
    # Added capture for text before the match. 
    $regex = '#\\b(\\w*)('; 
    $sep = ''; 
    foreach ($words as $word) 
    { 
     $regex .= $sep . preg_quote($word, '#'); 
     $sep = '|'; 
    } 
    # Added capture for text after the match. 
    $regex .= ')(\\w*)\\b#i'; 
    # Using \1 \2 \3 at relevant places. 
    return preg_replace($regex, '\\1<span class="SuccessMessage">\\2</span>\\3', $text); 
} 

Выход:

This is <span class="SuccessMessage">sim</span>ple test <span class="SuccessMessage">text</span> 
+0

Это просто превосходно !!! Большое спасибо, он отлично работает ... – KRA

0

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

Использовать jquery будет проще, чем php.

Простой пример:

function highlight(word, element) { 
var rgxp = new RegExp(word, 'g'); 
var repl = '<span class="yourClass">' + word + '</span>'; 
element.innerHTML = element.innerHTML.replace(rgxp, repl); } 

highlight('dolor'); 

Я надеюсь, что это поможет полностью.

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