Cherka Trova
Исходные данные:
Есть таблица с полями id (int), name (varchar) и text (text).
Пользователь вводит поисковый запрос $line.
Этот запрос обеззараживается и подсовывается в SELECT * FROM `table` WHERE `name` LIKE '%$line%' OR `text` LIKE '%line%'
В принципе ничего сложного (полнотекстовый поиск использовать не стал, не так уж велика таблица, да и сам текст там не больше двух-трех строк).

Но вот потребовалось вывести не только id и name, но еще и некую область текста, которая попала под условия поиска. В том-то и вопрос, как это сделать?

@темы: MySQL, PHP

Комментарии
03.10.2011 в 17:10

alhames.ru
Знакомая ситуация )
Я тупо потом в цикле прогонял через регулярку и выделял найденные слова.
03.10.2011 в 17:13

Cherka Trova
просто выводить весь текст описания как-то не хочется. Вариант вывести одно предложение от точки до точки, но я щас регулярку не соображу. Поможешь?
03.10.2011 в 17:54

Cherka Trova
Вот, что у меня получилось:
$preg = "/(\.[^\.]*)(".$line."[\w*])([^\.]*\.)/i";
Но что-то мне подсказывает, что можно изящнее.
03.10.2011 в 18:14

alhames.ru
ну можно так попробовать:
$preg = '#\.(.*?' . $line . '.*?\.)#si';
Сути дела не меняет..

Еще можно искать позицию с помощью strpos, а потом откусывать спереди и сзади определенное количество символов и дополнять многоточием если это не начало/конец текста - тогда будет нагляднее.
04.10.2011 в 09:16

Cherka Trova
alhames, осталась одна загвоздка. Левым ограничителем кроме точки надо сделать начало строки, поскольку искомый кусок может быть в первом предложении новой строки.
$preg = '#[^|\.](.*?' . $line . '.*?\.)#si'; - почему-то не срабатывает, или я что-то не так пишу?
04.10.2011 в 09:20

alhames.ru
Символ ^ внутри квадратных скобок означает отрицание. Т.е. по сути [^|\.] эквивалентно "один любой не символ" - т.е. он ничего не найдет.
Поэтому: '#(^|\.)(.*?' . $line . '.*?(\.|$))#si'
И выбираешь, соответственно, не 1й а второй карман.

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail