Как отметить найденные участки текста в результатах поиска?

vital

Новичок
Как отметить найденные участки текста в результатах поиска?

Подскажите, как выделить искомые слова в результате работы поиска? Например добавить теги <b>... Или надо как-то перелапачивать весь найденный текст для этого?
 

Фанат

oncle terrible
Команда форума
Или надо как-то перелапачивать весь найденный текст для этого?
а ты думал, что можно просто сказать волшебное слово? =)

перелопачивать, разумеется.
можно простым str_replace-ом
 

vital

Новичок
а str_replacОМ Как это будет выглядеть?... че-то не догоню... в смысле проциклить и заменять <искомые слова> на например <<b>Искомые слова</b>>? Так чтоли? :)
 

lorien

Новичок
Альтернативное решение. Раскрашивать html-выдачу на стороне клиента с помощью жабаскрипта.
 

andymc

Новичок
На личном опыте знаю, что с методом str_replace в данном случае возникнут проблемы, если искомая фраза латинская и может встретится в УРЛ
Тогда может испортится html код, если он есть.
str_replace - это правильно, но нужно проверять, ЧТО заменяется...
 

God

Новичок
str_replace заменит и вхождения искомых слов в другие (более длинные) слова, что не всегда правильно (ищем нос, а помечаем слово ностальгия). Лучше уж preg_
 

serglt

Анус, ой, Ахтунг
str_replace так же не поможет если символы слова в разных регистрах
Можно сгородить что нить типа.
PHP:
if (($pos = strpos (strtolower ($text), strtolower ($search))) !== false) {
    $len = strlen ($search);
    echo substr ($text, 0, $pos) . '<b>' . substr ($text, $pos, $len) . '</b>' . substr ($text, $pos + $len);
}
Только код на одну замену. Думаю топикстартер с циклами знаком.
 

God

Новичок
И все-таки лучше preg_replace, что-то типа этого
PHP:
function highlight($match)
{
	global $arrSearch;
	if (in_array(strtolower($match[1]), $arrSearch))
		return '<strong>' . $match[1] . '</strong>';
	else
		return $match[1];
}
// забиваем в масив искомые слова в нижнем регистре
$arrSearch = array('нос', 'конь');

$str = 'Конь при приступах ностальгии заливает в нос коньяк';

echo preg_replace_callback("#(\w+)#", 'highlight', $str);
 

serglt

Анус, ой, Ахтунг
Тож вариант, ток я не любитель глобальных переменных, а тем более в таком виде. И минус еще один в том, что на каждое слово в тексте вызывается in_array (). Что не есть очень хорошо.
 

hermit_refined

Отшельник
serglt
God
один из вас не знает о [m]stripos[/m], а другой - про \b и модификатор i.
код God'а вообще кошмарен.
 

serglt

Анус, ой, Ахтунг
Спасибо за просвящение, про эту функцию действительно не зинал. :) Век живи век учись.

-~{}~ 13.03.07 17:59:

так же как и про str_ireplace
 

serglt

Анус, ой, Ахтунг
Зинаю, это я так, к слову, что есть аналоги функций регистронезависимых.
 

God

Новичок
Никакие модификаторы не подойдут, если захочется выделять фрагменты с псевдоморфологией, т.е. не только нос, но и носом, носа, и т.д. Для этого и нужен callback.
 

hermit_refined

Отшельник
God
1. в вашем коде нет никакой обработки морфологии.
2. автор темы морфологию уж точно не просил.
3. есть ещё три, но тема собственно подсветки с учетом морфологии уже неоднократно обсуждалась, а тут она просто лишняя.

P.S. я так могу написать чумовой код на 200 строк, выводящий "Вася - дурак", с обоснованием того, что когда мне потребуется... (*список нужных замутов подставить*), он мне очень даже пригодится.
 
Сверху