Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Регулярные выражени, функции для поисковика по сайту
 
 автор: EvgenLog   (25.08.2006 в 14:06)   письмо автору
 
 

Здравствуйте снова! Я тут всё парюсь с поисковиком... И вот решил создать отдельную тему для обсуждения выражений, которые можно и нужно использовать для поиска. Искал на форуме (ВСЁМ) что-нибудь на эту тему... Нашёл кое-что. Там написано, что для "полноценного" поиска н нужно сильно извращаться, можно просто обрезать последние буквы в запросе и будут найдены всё однокоренные слова... Это окнечно здравая идея. Но какое регулярное выражение нужно использовать, какой шаблон, чтобы довести всё до ума? Т.е. отрывок текста с выделенными в нём, запрошенными словами. И вообще, чтобы не откуда попало шарил, а только с начала слова и выделялось оно полностью, а не только запрошенная часть... ???

   
 
 автор: cheops   (26.08.2006 в 02:07)   письмо автору
 
   для: EvgenLog   (25.08.2006 в 14:06)
 

Речь идёт о каком поиске? В базе данных или в файлах?

   
 
 автор: EvgenLog   (26.08.2006 в 17:24)   письмо автору
 
   для: cheops   (26.08.2006 в 02:07)
 

РЕчь идёт о поиске по файлам. Точнее, по одному файлу. В нём будет вся информация...

   
 
 автор: cheops   (26.08.2006 в 22:57)   письмо автору
 
   для: EvgenLog   (26.08.2006 в 17:24)
 

А какова структура файла?

   
 
 автор: EvgenLog   (27.08.2006 в 00:13)   письмо автору
 
   для: 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>&nbsp;<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>");
                                                           }
                                         }

   
 
 автор: cheops   (27.08.2006 в 11:19)   письмо автору
 
   для: EvgenLog   (27.08.2006 в 00:13)
 

А формат файла переорганизовать можно или на него что-то помимо поиска завязано?

   
 
 автор: EvgenLog   (27.08.2006 в 20:47)   письмо автору
 
   для: cheops   (27.08.2006 в 11:19)
 

Модно, но нужно, чтобы ссылки на страницу выводились и названия страниц... В принципе файл рассчитан только для поиска по нему, он выступает в качестве ОБЩЕЙ базы...

   
 
 автор: EvgenLog   (27.08.2006 в 21:25)   письмо автору
 
   для: EvgenLog   (27.08.2006 в 20:47)
 

В чём ошибка? Есть вот такое регулярное выражение...

<?
eregi
("^([[:space:]])(".$str.")([[:alnum:]])([[:space:]]$)"$part[$s], $matches)
?>

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

   
 
 автор: cheops   (28.08.2006 в 12:38)   письмо автору
 
   для: EvgenLog   (27.08.2006 в 21:25)
 

С пробельного символа начинается любое слово в файле, кроме самого первого слова... Класс [[:space:]] или любой другой символ обозначает всегда только один символ, если вам нужно найти несколько символов следует добавить + в конце [[:space:]]+.

   
 
 автор: EvgenLog   (29.08.2006 в 17:10)   письмо автору
 
   для: cheops   (28.08.2006 в 12:38)
 

Ну хорошо, с этим уже разобрался, ищит слова и даже все однокоренные тоже... Но что делать в случае если запрос не из одного слова, а целого предложения? Я рассматривал вариант, при котором рег. выражением обрабатывается запрос пользователя и в зависимости от того какому шаблон он соответствует выполняется поиск... Есть-ли более рациональные способы?

   
 
 автор: EvgenLog   (31.08.2006 в 13:07)   письмо автору
 
   для: EvgenLog   (29.08.2006 в 17:10)
 

Ответов так и не поступит? Я вопрос не понятно задал или просто никто не хочет помочь?

   
 
 автор: cheops   (31.08.2006 в 13:54)   письмо автору
 
   для: EvgenLog   (29.08.2006 в 17:10)
 

Что-то пропустил ваш пост... в этом случае предложение разбивается на отдельные слова и поиск идёт по каждому из слов в отдельности, если используется логика ИЛИ или в строке ищутся все слова разом, если логика И.

   
 
 автор: EvgenLog   (31.08.2006 в 20:52)   письмо автору
 
   для: cheops   (31.08.2006 в 13:54)
 

Спасибо... Всё так просто...

   
 
 автор: EvgenLog   (17.09.2006 в 09:22)   письмо автору
 
   для: EvgenLog   (31.08.2006 в 20:52)
 

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

   
 
 автор: kasmanaft   (17.09.2006 в 14:06)   письмо автору
 
   для: EvgenLog   (17.09.2006 в 09:22)
 

можно попробовать ф-ю explode (но тогда разделитель между словами должен быть одинаковым во всем предложении, т.е. либо все слова через один пробел, либо запятую - разницы нет, но разделитель одинавовый)

можно опять же рег. выражением разбить ... тогда и с разделителями проще будет ...

   
 
 автор: cheops   (17.09.2006 в 16:09)   письмо автору
 
   для: EvgenLog   (17.09.2006 в 09:22)
 

wordwrap() не очень удобно пользоваться, лучше использовать explode() или preg_split(), например
<?php
  $arr 
preg_split("|[\s]+|s",$text);
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования