| 
 
 
 
				
					|  Описание: Список разбросан по 26 файлам |  
  					| Поиск в теме | Версия для печати |  
					| 
				
					| UFO | Отправлено: 08 Февраля, 2008 - 09:55:21   |  
					| 
  
 Full Member
 
  
 Покинул форум
 Сообщений всего: 212
 Дата рег-ции: Янв. 2005
 
 Карма 0
 
 
 
 
  
 | Привет!   Возникла такая задача: реализовать поиск по списку, который записан по частям в файлы от a.dat до z.dat (26_латинских_букв.dat). В каждом файле приблизительно 8 тысяч строк. Но во всех файлах разное кол-во. На каждой строчке восьмисимвольная запись. Как организовать поиск части слова этих записей по каждому из списков? Допустим, пользователь вводит слово "yes", нажимает кнопку и скрипт ищет в каждом файле, на каждой строчке запись, которая содержит в себе слово "yes". Если найдено такое, то выводим его на экран. Было бы неплохо, если бы вывод выглядел приблизительно так:
 
 Цитата:Файл: a.datНайдено:
 ayes
 iyes
 zyes
 ====
 Файл: c.dat
 Найдено:
 ryes
 ====
 и т.д.
 Если в определенном файле ничего не найдено, то можно ничего и не выводить.
 Итак, вопрос: как же правильнее и проще всего сделать такой поиск?
 |  
					|  |   |  
				
					| UFO | Отправлено: 20 Февраля, 2008 - 14:03:56   |  
					| 
  
 Full Member
 
  
 Покинул форум
 Сообщений всего: 212
 Дата рег-ции: Янв. 2005
 
 Карма 0
 
 
 
 
  
 | Все никак не могу разобратся, проблема с preg_match_all и с выводом результата поиска. Вопрос относительно 26 файлов решил упростить - проще сделать всю базу в одном файле и по ней искать. Решено - теперь файл один, но проблемы все равно остались. На данный момент скрипт выглядит так:
 
 CODE:<center>Поиск<br><form action="<?php echo $_SERVER['PHP_SELF']; echo "?p=find"; ?>" method="POST" name="find">
 <input type=text value="<? echo $slovo ?>" size="10" maxlength="4" name="slovo">.net<br>
 <a href="index.php" onclick="document.find.submit(); return false">Проверить >>></a></form><br><br>
 <?php
 if (($act<>null) && ($slovo==null))
 {
 echo "Не был введен поисковый запрос</center>";
 }
 if (preg_match("#[^A-Za-z\-]#is",$slovo))
 {
 echo "Поисковый запрос содержит недопустимые символы или введен не правильно. Допустимые символы:  <font color=red>a-z</font> (буквы латинского алфавита) и <font color=red>-</font> (дефис).</center>";
 } else
 if ($slovo<>null) {
 if ((strlen($slovo)<2) or (strlen($slovo)>4)) {
 echo "Поисковый запрос должен состоять как минимум из двух, и как максимум из четырех символов";
 } else {
 $out=array();
 $fila = file("pages/db/a.dat");
 $lina = count($fila);
 for ($i = 0 ; $i < $lina; $i++)
 {
 if (preg_match_all("/\b.* $slovo .*\b/", $lina[$i], $out))
 // Тут начинаются проблемы. Вроде как результат в $out...
 echo $lina[$i]; // Это штука в принципе ничего не выводит...
 echo implode('<br>', $out); // А это результат, но выглядит он как count($fila) строчек с надписью "Array",
 echo "<br>"; // разделенных переводом строки...
 }
 }
 };
 ?>
 Вообщем, проблема описана в комметариях к коду.
 Еще есть проблема о том, как сообщить юзверю, что поиск ничего не нашел, т.е. куда ставить
 
 CODE:echo "Поиск не дал результатов</center>";  При этом использовать break; и exit(); нельзя, т.к. дальше есть еще вывод информации.
 |  
					|  |   |  
				
					| Furax | Отправлено: 20 Февраля, 2008 - 22:59:47   |  
					| 
  
 Бледнотик
 
  
 Покинул форум
 Сообщений всего: 1472
 Дата рег-ции: Март 2007
 Откуда: Иркутск, Сибирь, СССР
 
 Карма 32
 
 
 
 
  
 | Э-м-м... А вот это зачем? Почему просто не поставить кнопку submit? CODE:<a href="index.php" onclick="document.find.submit(); return false">Проверить >>></a> 
 А что сие значит (я имею в виду регулярное выражение)? Откуда вообще октоторпы?
 CODE:Если это тест на допустимость символов, то я бы сделал так:preg_match("#[^A-Za-z\-]#is",$slovo) CODE:preg_match('/[^A-Za-z\-А-Яа-я]/',$slovo) 
 Ещё вопрос: зачем разбиение по строкам при чтении файла, если мы потом ищем всё равно в каждой строке? В каждой строке-то можно и без регулярных выражений искать... Лучше искать сразу везде! Исключение составляют случаи, когда база настолько большая, что не входит в выделяемый скрипту объём оперативной памяти.
 
 Регулярное выражение в preg_match_all составлено неправильно: оно ищет следующую последовательность (записывай): границу слова; любое количество любых символов; пробел; введённое пользователем слово; пробел; любое количество любых символов; границу слова. Кроме того, поскольку строка заключена в двойные кавычки, слэши надо дублировать.
 
 Исправленный мною код выглядит вот так:
 CODE:Здесь поиск идёт сразу во всём файле, согласованные строки лежат в массиве $out[1]. Кроме того, я добавил ключ i к регулярному выражению, дабы поиск шёл независимо от регистра.$fila = file_get_contents("pages/db/a.dat");if (preg_match_all("/\\b(\\S*$slovo\\S*)\\b/i", $fila, $out, PREG_PATTERN_ORDER))
 {
 echo implode('<br>', $out[1]);
 }
 else
 {
 echo 'Ничего не найдено';
 }
 |  
					|  |   |  
				
					| UFO | Отправлено: 21 Февраля, 2008 - 15:03:52   |  
					| 
  
 Full Member
 
  
 Покинул форум
 Сообщений всего: 212
 Дата рег-ции: Янв. 2005
 
 Карма 0
 
 
 
 
  
 | Большое спасибо, Furax! Реально помог написать скрипт  
 Цитата:Э-м-м... А вот это зачем? Почему просто не поставить кнопку submit? Ссылкой красивее - работает так же как кнопка, но выглядит ссылкой, это чисто понты, дизайн, я и сам понимаю, что так проблем больше, но концепция сайта требует ссылку, а не привычную кнопку.
 
 Цитата:А что сие значит (я имею в виду регулярное выражение)? Откуда вообще октоторпы? Просто проверка на введенные символы, чтобы не было запрещенных символов. Скопировал откуда-то давно еще, поэтому и пользуюсь везде этим вариантом. Всегда работало правильно.
 
 Цитата:Ещё вопрос: зачем разбиение по строкам при чтении файла, если мы потом ищем всё равно в каждой строке? В каждой строке-то можно и без регулярных выражений искать... Лучше искать сразу везде! Исключение составляют случаи, когда база настолько большая, что не входит в выделяемый скрипту объём оперативной памяти. Я просто хотел создать цикл от i до кол-ва строк в файле, чтобы сравнивать каждую строку в файле с введенным словом в поле, если совпадает - выводим строку из файла на экран. Думал, что алгоритм такой.
 
 Цитата:Регулярное выражение в preg_match_all составлено неправильно Ага, в этом была большая проблема - написать граммотно функцию.
 
 Вообщем, еще раз спасибо, все работает как надо
     Респект
  |  
					|  |   |  |  
					| Поиск в теме | Версия для печати |  
  					| Страниц (1): [1] |  
  					| Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |  
  					| « PHP/Perl » |  
 
 
				
					| Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе.
 Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 
 |     |  
 
 
 |