Xpoint
   [напомнить пароль]

eregi - поиск в тексте, экранировка спецсимволов

Метки: [без меток]
2007-10-18 02:07:22 [обр] Dolp[досье]

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

$found = eregi_replace($what, '<span class="color: red">'.$what.'</span>', $where);

Поисковый запрос может включать любые символы.
И тут встала проблема, если юзер вводит в строку поиска, к примеру символ * или [, то получаю ошибку.
addslashes не подходит - не все, что "порождает ошибку" экранирует.

Где можно посмотреть все спецсимволы eregi_replace, подлежащие экранировке?
Как правильнее сделать экранировку? Может лучше реализовать подсветку текста как-то иначе?

спустя 40 минут [обр] Давид Мзареулян(536/1003)[досье]
Лучше используйте preg_replace. И, соответственно, preg_quote.
спустя 8 часов [обр] Dolp[досье]
Спасиб большое
спустя 25 минут [обр] Дмитрий Попов(171/509)[досье]
Э... Вот смотрю я приведенную строчку кода... А Вам точно регулярки тут нужны?
Откуда берется $what?
спустя 1 час 37 минут [обр] Jimi Dini(9/9)[досье]
спустя 15 минут [обр] Dolp[досье]
Регулярки не нужны.
$what - это поисковый запрос в чистом виде.
$str_ireplace() в PHP5, а у хостера моего пока PHP4 стоит.
спустя 58 минут [обр] Dolp[досье]

Необходимость только в регистронезависимой замене.
Иного способа, как сделать её, не прибегая к регулярным выражениям, я не нашел.

Сейчас делаю так:

$found = preg_replace("/" . preg_quote($what, "/") . "/i", '<span class="color: red">' . $what . '</span>', $where);

Есть правда недостаток у такой реализации замены. Если юзер вводит запрос в нижнем регистре, то в результатах поиска подсвеченное слово тоже будет в нижнем регистре, даже если в базе оно набрано заглавными буквами. Так как оно будет заменено запросом.

Решение я придумал - нужно вместо $what во второй параметр preg_replace подставлять найденное совпадение с регулярным выражением. Вот как это сделать, сейчас буду изучать. С регулярками практически нгикогда дела не имел:)

спустя 14 минут [обр] Дмитрий Попов(171/509)[досье]
$found = preg_replace("/(" . preg_quote($what, "/") . ")/i", '<span class="color: red">\\1</span>', $where);
спустя 1 час 46 минут [обр] Dolp[досье]
Дмитрий Попов[досье] Спасибо, уже так и сделал:)
Ну, вроде бы, вопрос закрыт.
Powered by POEM™ Engine Copyright © 2002-2005