Cherka Trova
Исходные данные:
Есть таблица с полями id (int), name (varchar) и text (text).
Пользователь вводит поисковый запрос $line.
Этот запрос обеззараживается и подсовывается в SELECT * FROM `table` WHERE `name` LIKE '%$line%' OR `text` LIKE '%line%'
В принципе ничего сложного (полнотекстовый поиск использовать не стал, не так уж велика таблица, да и сам текст там не больше двух-трех строк).
Но вот потребовалось вывести не только id и name, но еще и некую область текста, которая попала под условия поиска. В том-то и вопрос, как это сделать?
Есть таблица с полями id (int), name (varchar) и text (text).
Пользователь вводит поисковый запрос $line.
Этот запрос обеззараживается и подсовывается в SELECT * FROM `table` WHERE `name` LIKE '%$line%' OR `text` LIKE '%line%'
В принципе ничего сложного (полнотекстовый поиск использовать не стал, не так уж велика таблица, да и сам текст там не больше двух-трех строк).
Но вот потребовалось вывести не только id и name, но еще и некую область текста, которая попала под условия поиска. В том-то и вопрос, как это сделать?
Я тупо потом в цикле прогонял через регулярку и выделял найденные слова.
$preg = "/(\.[^\.]*)(".$line."[\w*])([^\.]*\.)/i";
Но что-то мне подсказывает, что можно изящнее.
$preg = '#\.(.*?' . $line . '.*?\.)#si';
Сути дела не меняет..
Еще можно искать позицию с помощью strpos, а потом откусывать спереди и сзади определенное количество символов и дополнять многоточием если это не начало/конец текста - тогда будет нагляднее.
$preg = '#[^|\.](.*?' . $line . '.*?\.)#si'; - почему-то не срабатывает, или я что-то не так пишу?
Поэтому: '#(^|\.)(.*?' . $line . '.*?(\.|$))#si'
И выбираешь, соответственно, не 1й а второй карман.