Описание: Список разбросан по 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:$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 'Ничего не найдено';
} Здесь поиск идёт сразу во всём файле, согласованные строки лежат в массиве $out[1]. Кроме того, я добавил ключ i к регулярному выражению, дабы поиск шёл независимо от регистра. |
|
|
UFO |
Отправлено: 21 Февраля, 2008 - 15:03:52
|
Full Member
Покинул форум
Сообщений всего: 212
Дата рег-ции: Янв. 2005
Карма 0
|
Большое спасибо, Furax! Реально помог написать скрипт
Цитата:Э-м-м... А вот это зачем? Почему просто не поставить кнопку submit?
Ссылкой красивее - работает так же как кнопка, но выглядит ссылкой, это чисто понты, дизайн, я и сам понимаю, что так проблем больше, но концепция сайта требует ссылку, а не привычную кнопку.
Цитата:А что сие значит (я имею в виду регулярное выражение)? Откуда вообще октоторпы?
Просто проверка на введенные символы, чтобы не было запрещенных символов. Скопировал откуда-то давно еще, поэтому и пользуюсь везде этим вариантом. Всегда работало правильно.
Цитата:Ещё вопрос: зачем разбиение по строкам при чтении файла, если мы потом ищем всё равно в каждой строке? В каждой строке-то можно и без регулярных выражений искать... Лучше искать сразу везде! Исключение составляют случаи, когда база настолько большая, что не входит в выделяемый скрипту объём оперативной памяти.
Я просто хотел создать цикл от i до кол-ва строк в файле, чтобы сравнивать каждую строку в файле с введенным словом в поле, если совпадает - выводим строку из файла на экран. Думал, что алгоритм такой.
Цитата:Регулярное выражение в preg_match_all составлено неправильно
Ага, в этом была большая проблема - написать граммотно функцию.
Вообщем, еще раз спасибо, все работает как надо
Респект |
|
|
|
Поиск в теме | Версия для печати |
Страниц (1): [1] |
Сейчас эту тему просматривают: 3 (гостей: 3, зарегистрированных: 0, скрытых: 0) |
« PHP/Perl » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|