Подсветка целого слова по вхождению

Kolesikoff

Новичок
Подсветка целого слова по вхождению

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

Допустим есть строка "Компания Снабгаз - газовое и водоснабжение населения"
По тексту идет поиск, например "газ|вод*"
Как подсветить слово, где встречается "газ" или "вод" целиком, а не только кусочек "газ"?

Такое слово может быть в начале строки или конце, а может заканчиваться запятой, точкой...

Все мои попытки сделать что либо работающее не увенчались успехом. :(
 

440hz

php.ru
Kolesikoff
извини, сам ищещь SQL-запросами или какая-то система ищет? просто я сам поиском много занимался. т.е. что у тебя на входе и что возвращается скрипту?
 

white phoenix

Новичок
PHP:
$string = "Компания Снабгаз - газовое и водоснабжение населения";
$result = preg_replace('~\w*(?:газ|вод)\w*~i','<b>$0</b>',$string);
var_dump($result);
// string(73) "Компания <b>Снабгаз</b> - <b>газовое</b> и <b>водоснабжение</b> населения"
UPD: так лучше
 

Kolesikoff

Новичок
Сам ищу.
фактически к финалу у меня получается строка подсветки искомых слов вида:
"газ|газа|газу|газ|газом|газе..." с различными формами слова, либо "газ|газа|...|видеонаблюден" - обрубленное стеммером слово, если его нет в словаре морфологии

-~{}~ 09.02.06 12:42:

white phoenix, спасибо за ответ. Вы мне очень помогли :)

-~{}~ 09.02.06 13:00:

Автор оригинала: 440hz
т.е. что у тебя на входе и что возвращается скрипту?
После долгих мучений с полнотекстовым поиском я пришел к такому решению.
База у меня не очень большая, поэтому пока такой вариант меня устраивает.

первое с чем я начал мучаться - это с тем, что при полнотекстовом поиске запись вида "производство сахара, производство печенья, производство пряников" при поиске "производство тележек" вылетает первой по релевантности из-за перевеса по повторяющемуся слову, хотя сам понимаешь, тележки и печенье - это разные вещи :)

Поэтому сейчас используется следующий алгоритм - в базе есть поле с обычным текстом, который просто выводится пользователю и созданное на основе него индексное поле, содержащее базовые формы слов или стеммерные без каких либо повторений.

Искомые слова приводятся к такому же виду и уже потом осуществляется полнотекстовый поиск по тому сформированному индексному полю.
 

kruglov

Новичок
Kolesikoff
Ага, найдем и газель, и газават...
Есть мысль после отрубки "стеммером" подклеить разных окончаний (может, даже избыточных, слова типа "газой" все равно не найдутся в тексте)

p.s. Забудем про "сектор Газа", ибо и "газ" - это надуманный пример отсутствующего в словаре слова.
 

Kolesikoff

Новичок
kruglov
Да... увы, стеммер (особенно!) на коротких словах , отсутствующих в словаре - дает ошибки, выливающиеся в "нашли то, чего не искали". Но это и не так часто бывает.
А вот на сложносоставных словах или именах собственных типа магазин "Карапетовский" вполне съедобно работает :)
Бесспорно - это не идеал.

Насчет подклейки окончаний замечу вот что. Если это слово отсутсвует в словаре - мне кажется окончания тут уже мало помогут.
 

kruglov

Новичок
Kolesikoff
Слово "кипекса" отсутствует в словаре.
Это существительное.
Основа - "кипекс".
Если это мужской род - окончания -а -ом, -ы, -е, -у, -ами и т.д.
Если женский: -ой, -е, -у и пр.
Объединяем, получаем кипексой, кипексом, кипексами и пр.
Их и ищем.

-~{}~ 09.02.06 14:46:

"кипексов"
или это существительное, или фамилия
кипексова, кипексому, кипексы, кипекс и пр.
 

Kolesikoff

Новичок
а не проще ли после обрезки стеммером сделать поиск IN BOOLEAN MODE "кипекс*", который найдет кипексой, кипексом, кипексами и пр. ? :)
 

kruglov

Новичок
Ну, если вам "кипексостроительный" тоже надо находить, то проще, конечно.

Или "компенсация" при поиске "комп"

-~{}~ 09.02.06 14:56:

p.s. Сами говорите - "не идеал", а потом отстаиваете.
 

Kolesikoff

Новичок
kruglov
Пример хорош, тут спорить не буду :)

Но ту еще все упирается в другую сторону - в пользователя, который расширеным поиском пользоваться как правило не хочет... А вводит слова как ему больше нравится.
И пишет он, родимый, в строке поиска "электро" - горя желанием найти все от электропилы до электрода...
А ему бац и окончания "элетров, электром, электрами...."

ЗЫ. Я отстаиваю не идеал, а модель. У меня просто задача несколько проще, чем сделать второй Яндекс. Сленга нет, весь текст грамматически корректен и редактором максимально приближен к потенциальному искателю.

С одной стороны ваша, с дальнейшей обработкой слов, но неоднозначным результатом на выходе и моя, без обработки, но больше вешающая на пользователя. Истина как всегда где то посередине :)
Если мы до нее докопаемся - всем хорошо будет
 

kruglov

Новичок
Kolesikoff
Пользователь уже давно отучился писать электро, ибо в яндексе еще с прошлого века морфология.
 

Kolesikoff

Новичок
kruglov

видимо ты прав...
а может быть они делают так - находят по орфографическому словарю ближайшее похожее слово (ютюг->утюг) и делают поиск по подобию
 
Сверху