Эта тема на forum.dklab.ru


Дмитрий Самсонов: Подсветка результатов поиска по части слова
Здравствуйте!

На моем сайте работает поиск, который ищет подстроки в тексте, т.е. если в качестве ключа для поиска указать "банк", то будут найдены слова "банки", "банка", "банков", и т д.. Я хочу подсвечивать в результатах поиска все слово, а не только подстроку, по которой оно было найдено. Для этого использую такой вот код:

$word = '(' . implode('|', /*iconv("UTF-8","CP1251",*/$searchStems/*)*/) . ')'; // в массиве $searchStems лежат части слов, которые нужно подсветить
echo preg_replace("#\b$word.*\b#Uis", "<b style=\"background-color:yellow; color:red;\">\\0</b>", $res);

На локальной машине (с Денвером) все работает, т.е. слова подсвечиваются желтым, а вот на хостинге нет - ошибок не выдается, но ничего не подсвечивается. :( Подскажите кто-нибудь, чем дело, пожалуйста! Даже не знаю, куда копать. :(
Миша Спларов:
Дмитрий Самсонов, приведите минимально рабочий код-пример?
Дмитрий Самсонов:
Пример.

Ищем по фразе "химические реактивы". Стеммер режет слова, и остается "химическ" и "ре".
В переменной $res лежит то, что нашел поиск. Теперь нужно подсветить все слова, содержащие "химическ" и "ре".


$word = '(химическ|ре)';
$res = 'Исследование геохимического режима
Предприятия тяжелого энергетического, транспортного, химического, нефтехимического машиностроения
Предприятия химические и нефтехимические
Предприятия целлюлозно-бумажной и лесохимической промышленности
Скрубберы для очистки вентиляционных выбросов от вредных химических веществ
Отбор проб насыпных грузов для определения физико-механических и химических характеристик
Реакторы для химической промышленности';

echo preg_replace("#\b$word.*\b#Uis", "<b style=\"background-color:yellow; color:red;\">\\0</b>", $res);
Миша Спларов:
Воспользуйтесь функцией setlocale.
Дмитрий Самсонов:
Миша Спларов, большое спасибо за совет. Проблема решена. Покурил форум на тему setlocale() - нашел вот что: http://forum.dklab.ru/viewtopic.php?p=136268#136268. Для ленивых - помогла такая строчка перед вызовом preg_replace():

setlocale(LC_ALL, array('ru_RU', 'rus_RUS.1251', 'ru_RU.CP1251','ru_RU.KOI8-R', 'rus_RUS.1251'));


Теперь вдруг всплыла еще одна: используемый регэксп почему-то не хочет выделять слова, в которые подстрока входит не с начала слова (например, для стема "химическ" слово "нехимические" выделено не будет). Подскажите, пожалуйста, как это поправить?
Миша Спларов:
Подскажите, пожалуйста, как это поправить?
Сделать левую часть рег. выражения анаголично правой :-)
Кстати, над рег.выражением тоже можно поработать, хотя-бы для того, чтобы выделялись слова написанные через дефис.

PS: на счёт локали в том сообщение что-то перемудрили, лично мне всегда хватало "ru_RU" или "ru_RU.CP1251".
Maus:
Дмитрий Самсонов
забавно смотрится вклинившееся KOI8-R (-:

Эта тема на forum.dklab.ru