Вырезка найденного слова с определённым количеством текста вокруг

kpp

Новичок
Вырезка найденного слова с определённым количеством текста вокруг

ссылка на образец

Вырезка найденного слова с определённым количеством текста вокруг.
Как сделать такую вещь?

На странице поиска найденные результаты делятся по 20 штук на страницу.
Далее из 20 найденных (подходящих под запрос) страниц у каждой надо взять текст, по которому была найдена страница, и выделить его bold, при этом ВОПРОС в том, как из всего текста взять только по 50 символов перед и после совпадения с запросом.(чтобы пользователь мог ориентироваться о чём будет статья, которую ему предлагают в качестве подходящей).

Вторая проблема в том случае, когда слово, подошедшее под поиск, будет стоять в паре символов от ещё одного подошедшего слова (ну это уже следующий шаг, ссылка на битрексовый сайт дана выше, у них эталонный вариант, хотя есть недочёт в том, что разрешён поиск по одному символу... это загружает сервер и толка от поиска мало).
 

WoLFiks

Не курю...
находишь позицию совпадения и вырезаешь кусок от этой позиции + - 50 символов.

Все требуемые для этого дела функции -
http://php.ru/manual/ref.strings.html

А вообще лучше не 50 символов, а + - n-слов. Так будет выглядеть приятнее...
 

kpp

Новичок
C этим понятно, а как поиску запретить принимать совпадения с тем, что находится внутри тегов? Если простыми регулярками, то всё нормально бы было, но в SQL'ом LIKE'е специальный урезанный синтаксис, которым даже не понятно ["непонятно" пишЕтся раздельно или слитно? ] как ставить отрицание. Там только отрицание от всего шаблона можно поставить (!).


Как перевести такую регулярку на урезанный язык sql?:

"/.*>?[^<]".$search_word."[^>]<?.*/"

Я думаю, что этот шаблон не допустит поиск во внутренностях тегов.
 

Wicked

Новичок
"пишится" пишется через "е" :)

Насчет кусочков текста - это реализовано в Sphinxsearch ? Ты уверен, что ты хочешь сделать велосипед?

C этим понятно, а как поиску запретить принимать совпадения с тем, что находится внутри тегов?
дай-ка догадаюсь... индексировать текст, в котором нету тэгов?
 

Alexandre

PHPПенсионер
А вообще лучше не 50 символов, а + - n-слов. Так будет выглядеть приятнее...
усложним задачу, около 50 слов, округлим до первого включаемого предложения (знак точка, после точки слово должно начинаться с большой буквы)
 

kpp

Новичок
Автор оригинала: Wicked

Ты уверен, что ты хочешь сделать велосипед?
Я хочу сделать примитивнейший поиск по таблице. В этой таблице поля для поиска следующие:
1) Имя страницы.
2) Заголовок страницы.
3) Текст страницы ("content").

С первыми двумя всё понятно - там нет тегов.
С третьим проблема. Ввожу в поиск strong - нажодит уйму страниц. Понятное дело, что все совпадения только с тегом.

PHP:
$q=mysql_escape_string($q);
$res=mysql_query("SELECT SQL_CALC_FOUND_ROWS id,title FROM pages WHERE (name LIKE '%".$q."%' OR text LIKE '%".$q."%' OR title LIKE '%".$q."%') AND tpl_name!='' LIMIT ".$search_page_number*$search_limit.", ".$search_limit);//	search
$all=mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0);//founded rows count
Вот, что сейчас имеется на сайте.
(Мотайте на ус. Там за один запрос практически я получил и количество совпадений(всех!) и результат, состоящий из $search_limit строк)
.
.
.
.
Чуть не забыл, велосипед не хочу изобретать. При этом хочу реализовать весь поиск в пределах LIKE "...", записей тысячами не намечается в данной таблице => LIKE вполне подходит.
Только как переписать с человеческого языка регулярных выражений на язык SQL хз.
.
.
.
$q=trim($_REQUEST['q']);
$q = preg_replace("/[^\w\x7F-\xFF\s]/", "", $q);
$q = substr($q, 0, 64);
.
Вот так подчищается строка поиска. Вторая строка мне не совсем понятна. Но она своё дело делает. "всё, что не является буквой или цифрой И также всё, что не входит в промежуток 16-ричный \x7F-\xFF и не является пробельным символом \s, всё вычищается"
 

Wicked

Новичок
Мотайте на ус. Там за один запрос практически я получил и количество совпадений(всех!) и результат, состоящий из $search_limit строк
ух ты!

С третьим проблема. Ввожу в поиск strong - нажодит уйму страниц. Понятное дело, что все совпадения только с тегом.
ок... еще раз... может быть стоит искать по тексту, в котором нету тегов, чем придумывать белиберду в виде регулярных выражений, которые не будут игнорировать совпадения в тегах?
 

kpp

Новичок
Как можно хранить текст без тегов? Это нонсенс.

http://u-volga.ru/search/?key=strong

Вот на что напоролся буквально при просмотре устройства поиска третьего случайно-попавшегося сайта (хотел выяснить что именно поменялось в ручках дверей новой приоры). Тут как и у "горепрограммистов" ищется тег strong. При этом все 12000 подходящих записей выводятся на одной странице.

Про теги я немного не понял. У меня в поле текста страницы разумеется теги лежат. (всё это дело редактировать будут разные сотрудники... для них есть FCKеditor ... )

.
.
.
.
Есть предложения? (Наличие тегов в тексте принимается как данность).
.
.
Автор оригинала: Wicked
это реализовано в Sphinxsearch
- тут меганакрученно всё реализовано, на 5 файликов раскидали + конфиг... А простой велосипед есть? А то это снегоход какой-то, а не велосипед.
.
.
.
.

[Чтобы не тратить "пост", напишу в текщем ответ на следующий пост:
Лучше одну регулярку, хоть и она будет сильно тормозить процесс поиска, но поиск не играет решающей роли, увеличение информации на 70%.... поиск того не стоит. Лучше одну медленную регулярку написать.]
 

baev

‹°°¬•
Команда форума
Про теги я немного не понял. У меня в поле текста страницы разумеется теги лежат
Просто добавляется ещё одно поле, в котором хранится тот же текст, но без тегов.
 

Sluggard

Новичок
Как можно хранить текст без тегов? Это нонсенс.
Не-не, нельзя. Текст же без тегов сам по себе не устойчив и может рассосаться. Теги без текста - еще куда не шло. Хотя тоже как-то все это подозрительно...
 

kpp

Новичок
Ну так что?

Все создают отдельное поле для очищенного текста? Это может быть оправданно только при мегапосещаемых ресурсах, где скорость стоит во главе угла.

Нужно всего лишь один запрос написать, ФaHат, слово за тобой(вами).
 
Сверху