|
|
|
| Здравствуйте снова! Я тут всё парюсь с поисковиком... И вот решил создать отдельную тему для обсуждения выражений, которые можно и нужно использовать для поиска. Искал на форуме (ВСЁМ) что-нибудь на эту тему... Нашёл кое-что. Там написано, что для "полноценного" поиска н нужно сильно извращаться, можно просто обрезать последние буквы в запросе и будут найдены всё однокоренные слова... Это окнечно здравая идея. Но какое регулярное выражение нужно использовать, какой шаблон, чтобы довести всё до ума? Т.е. отрывок текста с выделенными в нём, запрошенными словами. И вообще, чтобы не откуда попало шарил, а только с начала слова и выделялось оно полностью, а не только запрошенная часть... ??? | |
|
|
|
|
|
|
|
для: EvgenLog
(25.08.2006 в 14:06)
| | Речь идёт о каком поиске? В базе данных или в файлах? | |
|
|
|
|
|
|
|
для: cheops
(26.08.2006 в 02:07)
| | РЕчь идёт о поиске по файлам. Точнее, по одному файлу. В нём будет вся информация... | |
|
|
|
|
|
|
|
для: EvgenLog
(26.08.2006 в 17:24)
| | А какова структура файла? | |
|
|
|
|
|
|
|
для: cheops
(26.08.2006 в 22:57)
| | В файле вся информация, по которой можно совершать поиск, т.е текстовые материалы, данные из базы и т.д. Всё в одном. Структура след.:
Ссылка на страницу||
Заголовок страницы||
Содержание, по которому совершается поиск||
Ссылка на страницу||
Заголовок страницы||
Содержание, по которому совершается поиск||
И иак далее. Поиск осуществляется только по тексту длинна которого превышает 100 символов, остальное считается ссылками и заголовками. Если искомая строка найдена, то высчитывается ссылка на страницу и её заголовок, методом вычитания 1-го или 2-х из индекса массива, в котором обнаружено совпадение. Вот пример кода.
...
$num=0;
$results=0;
if(stristr($part[$s], "".$str."") && strlen($part[$s]) > 100)
{
//Определение позиции указателя в строке.
$get_pos=strpos($part[$s], "".$str."");
//Отображение краткого содержания нейденного текста.
$show_text=substr($part[$s], $get_pos-100, 300);
//Вычисление части массива, содержащей ссылку.
$var_1=$s-2;
$link=$part[$var_1];
//Вычисление части массива, содержащей заголовок страницы.
$var_2=$s-1;
$name=$part[$var_2];
$results++;
$num++;
$res=1;
if($num==1)
{
echo ("<br><div class='contentTxt'><b>".$num.".</b> <a href='http://www.rsppko.ru/content/".$link."'>".$name."</a></div>");
echo ("<div class='contentTxt'>...".$show_text."...</div>");
}
if($num > 0)
{
echo ("<div class='contentTxt'>Количество совпадений:".$results."</div>");
}
}
|
| |
|
|
|
|
|
|
|
для: EvgenLog
(27.08.2006 в 00:13)
| | А формат файла переорганизовать можно или на него что-то помимо поиска завязано? | |
|
|
|
|
|
|
|
для: cheops
(27.08.2006 в 11:19)
| | Модно, но нужно, чтобы ссылки на страницу выводились и названия страниц... В принципе файл рассчитан только для поиска по нему, он выступает в качестве ОБЩЕЙ базы... | |
|
|
|
|
|
|
|
для: EvgenLog
(27.08.2006 в 20:47)
| | В чём ошибка? Есть вот такое регулярное выражение...
<?
eregi("^([[:space:]])(".$str.")([[:alnum:]])([[:space:]]$)", $part[$s], $matches)
?>
|
Если я всё правильно понимаю, то должна быть найдена строка, которая начинается с пробела (т.е. начало слова), после пробела следует искомая последовательность знаков, затем люой набор других символов и заканчивается всё это пробелом. Т.е. долно найтись любое слово. Естественно по $str вписывается не полностью слово, а лишь часть, чтобы была возможность найти и однокоренные слова... | |
|
|
|
|
|
|
|
для: EvgenLog
(27.08.2006 в 21:25)
| | С пробельного символа начинается любое слово в файле, кроме самого первого слова... Класс [[:space:]] или любой другой символ обозначает всегда только один символ, если вам нужно найти несколько символов следует добавить + в конце [[:space:]]+. | |
|
|
|
|
|
|
|
для: cheops
(28.08.2006 в 12:38)
| | Ну хорошо, с этим уже разобрался, ищит слова и даже все однокоренные тоже... Но что делать в случае если запрос не из одного слова, а целого предложения? Я рассматривал вариант, при котором рег. выражением обрабатывается запрос пользователя и в зависимости от того какому шаблон он соответствует выполняется поиск... Есть-ли более рациональные способы? | |
|
|
|
|
|
|
|
для: EvgenLog
(29.08.2006 в 17:10)
| | Ответов так и не поступит? Я вопрос не понятно задал или просто никто не хочет помочь? | |
|
|
|
|
|
|
|
для: EvgenLog
(29.08.2006 в 17:10)
| | Что-то пропустил ваш пост... в этом случае предложение разбивается на отдельные слова и поиск идёт по каждому из слов в отдельности, если используется логика ИЛИ или в строке ищутся все слова разом, если логика И. | |
|
|
|
|
|
|
|
для: cheops
(31.08.2006 в 13:54)
| | Спасибо... Всё так просто... | |
|
|
|
|
|
|
|
для: EvgenLog
(31.08.2006 в 20:52)
| | Вот дошло дело до того, что нужно вернуться к разработке этого *** поиска... Попытался я разбить строку на слова функцией wordwrap(), разбить-то она разбила, очень даже хорошо, но как по ним искать, ведь эта функция никаких массивов не возвращает. Видимо нужно использовать не её, но тогда какую?! Помогите пожалуйста разобраться... | |
|
|
|
|
|
|
|
для: EvgenLog
(17.09.2006 в 09:22)
| | можно попробовать ф-ю explode (но тогда разделитель между словами должен быть одинаковым во всем предложении, т.е. либо все слова через один пробел, либо запятую - разницы нет, но разделитель одинавовый)
можно опять же рег. выражением разбить ... тогда и с разделителями проще будет ... | |
|
|
|
|
|
|
|
для: EvgenLog
(17.09.2006 в 09:22)
| | wordwrap() не очень удобно пользоваться, лучше использовать explode() или preg_split(), например
<?php
$arr = preg_split("|[\s]+|s",$text);
?>
|
| |
|
|
|