Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: php и grep
Форумы портала PHP.SU » » Операционная система и системные вызовы » php и grep

Страниц (1): [1]
 

1. black_ru - 08 Июля, 2011 - 11:59:18 - перейти к сообщению
Задумался, как сделать простейший поиск по текстовым файлам.
Допустим, статьи хранятся в каталоге в отдельных файлах.
Задача простая: ввели слово, получили вывод ссылок на страницы, где встретилось это слово.

Есть ли смысл сделать такой поиск с помощью php+grep ?
Или все-таки решить все это стандартными средствами php?
Буду благодарен за ссылку на обучающий мануал по созданию простого поиска.
2. EuGen - 08 Июля, 2011 - 12:09:17 - перейти к сообщению
А лучше
http://sphinxsearch[dot]com/

grep вполне подойдет для простейшей задачи.
Средствами php - это нужно использовать скажем http://php.su/functions/?glob и http://php.su/functions/?preg_match
3. DeepVarvar - 08 Июля, 2011 - 12:28:30 - перейти к сообщению
EuGen пишет:
А лучше
http://sphinxsearch.com/

Ух ты! Какой серьезный зверь!
EuGen я бы с удовольствием почитал хорошую статью на русском о том что это за зверь, как его ставить, где использовать, как настраивать...
Я бы даже просил бы вас написать такую статейку, вы хорошо излагаете.
Это без подколок - я на полном серьёзе.
4. EuGen - 08 Июля, 2011 - 12:33:45 - перейти к сообщению
Да я бы рад, только сейчас очень много работы по реструктуризации форума и его оптимизации.

Несколько раз я с нуля разворачивал эту систему, впечатления наилучшие. Описать видимо и правда стоит.
5. DeepVarvar - 08 Июля, 2011 - 12:46:08 - перейти к сообщению
Вообще можно бы сделать на форуме еще один раздел "статьи", ну или на самом портале их продолжать размещать, просто на портале нет возможности комментировать выложенные материалы.
6. EuGen - 08 Июля, 2011 - 12:47:14 - перейти к сообщению
Такой раздел есть - Обсуждение статей.
7. DeepVarvar - 08 Июля, 2011 - 12:49:37 - перейти к сообщению
Я имел виду не одно обсуждение или одни статьи, имелась виду совокупность того и другого. Почитал... и внизу страницы коменты пошли. Удобно и привычно.
8. EuGen - 08 Июля, 2011 - 12:51:22 - перейти к сообщению
Тоже есть.
Ветка уроков. В основном, все полезные статьи у нас там
9. black_ru - 08 Июля, 2011 - 18:08:39 - перейти к сообщению
Сделал пока с помощью grep. Правда, результат поиска считывается в файл, вдобавок обрабатывается sed и затем другим вызовом с помощью cat выводится.
Наверное, не очень хорошо создавать файл для каждого поискового запроса?
Но скрипт поиска получился буквально из нескольких строк.
10. DeepVarvar - 08 Июля, 2011 - 18:20:34 - перейти к сообщению
black_ru А код увидеть можно?
11. black_ru - 08 Июля, 2011 - 19:56:36 - перейти к сообщению
Переделал, убрал считывание в файл. Получилось вообще в несколько строчек Улыбка

не вижу особого смысла выкладывать код, смысл которого по сути упирается
в
CODE (htmlphp):
скопировать код в буфер обмена
  1. system(grep -bla-bla-bla | sed -bla-bla=bla)
12. black_ru - 09 Июля, 2011 - 06:15:17 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. grep -rw -m1  $sech baza/ | sed -e 's/baza/<a href=index.php?page=/;s/[/]//;s/.txt:/>Ссылка  <\/a>/;a</br>'


А похожую штуку можно средствами php сделать? Я так понимаю, preg_grep
нужно использовать?
И как быть, стандартный системный grep уже сканирует директорию.
А как поступить тут с поиском?
Сканировать директорию, читать файлы, свести все в массив и сравнивать c образцом?
13. black_ru - 09 Июля, 2011 - 18:55:42 - перейти к сообщению
В общем пока сделал так: при создании статьи создается файл index.dat,
в который пишется все заголовки в виде ссылки, каждая с новой строки:
(Я не вижу смысла искать все, что можно в статье, так как это сильно меняет задачу)
CODE (html):
скопировать код в буфер обмена
  1. <a href=index.php?page=1>Заголовок статьи</a>
  2. <a href=index.php?page=1>Заголовок статьи2</a>


Сам поиск:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4.  
  5. $serch=($_GET['srch']);
  6.  
  7. if (($_GET['srch']!='') && !preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$serch) &&
  8. strlen($sech) < 20)  {
  9. $command = "grep -wi  $serch index.dat";
  10. echo "<br><br><b>Результат поиска</b><br><br>";
  11. system($command);
  12. } else {
  13. echo "<br><b>Проверьте  корректность ввода данных</b>";
  14. }
  15.  
  16. ?>
  17.  

В коде запретил ввод спецсимволов и ограничил число вводимых.
Вызвал grep для поиска только целого слова - ключ -w, без учета регистра - ключ -i.
Можно, правда, выводить и без записи в файл для индексации, а искать по всей директории и подавлять вывод ключом -m1, например но так, наверное будет хуже, если будет много запросов.
Работает вроде бы, как мне нужно, но почему-то кажется, что можно еще ускорить процедуру, убрав вообще grep и сделать вывод из файла index.dat через ассоциативный массив.
Но четкой схемы, как это сделать - пока не придумал.

 

Powered by ExBB FM 1.0 RC1