Поиск файлов PHP - PullRequest
       2

Поиск файлов PHP

2 голосов
/ 23 сентября 2010

Мне нужно выполнить поиск файлов с помощью php, и у меня есть поиск по имени файла вниз с помощью glob, но мне все еще нужно искать внутри файлов.

У меня есть прототип, на tann98.vacau.com/file-search, но мне нужны ключевые слова и предложения.Кроме того, для поиска совпадений нужно заглянуть внутрь файлов.

У кого-нибудь есть идеи, как это сделать?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

Очень простой способ - прочитать каждый файл в PHP и выполнить поиск по ним с помощью одной из функций поиска строк.

//loop through all filenames and for each one:
$contents = file_get_contents($filename) ;
if (strpos($contents, $keyword) !== false) {
    //found a match!
}

Однако это очень неэффективно, так как вам придется выполнять чтение и поиск файлов каждый раз, когда вы выполняете поиск.

Вот почему поисковые системы заранее создают индексы всех файлов, о которых они знают, а затем просто просматривают эти индексы для ключевого слова поиска. Если вы хотите разобраться в этом, вам понадобится отдельный скрипт (скажем, indexer.php), который будет делать что-то вроде этого:

  • цикл по каждому файлу, получение его содержимого
  • разбить их на слова
  • вести учет уникальных слов, найденных в этом файле
  • сохранить эту запись в базе данных или файле на диске

И пусть он запускается время от времени, чтобы обновить свой индекс. Например, его индекс может выглядеть так:

$words = array(
    'mobile' => array('filename1.txt', 'filename2.txt'),
    'answer' => array('filename3.txt', 'filename5.txt', 'filename6.txt'),
    //...

);

Затем, когда вы ищете определенное ключевое слово, вам просто нужно загрузить индекс из файла индекса или базы данных и посмотреть, в каких именах файлов это слово найдено.

if (isset($words[$keyword])) {
    echo "Found in: " . join(', ', $words[$keyword]) ;
}

И у вас есть очень упрощенный способ сделать что-то подобное. Далее вы можете сохранить индекс в базе данных, подсчитать, сколько раз слово встречается в каждом файле, чтобы предоставить более релевантные результаты и т. Д. И т. Д.

0 голосов
/ 23 сентября 2010

чтение всего файла в переменную в php? серьезно, давай! php - это язык гипертекстовых скриптов! вы будете сталкиваться с ошибками памяти и уродливыми другими вещами ... делайте это только в том случае, если вы знаете, что ваши файлы не превышают максимальный размер в несколько килобайт каждый ...

если вам нужна производительность, вот решение для oyu:

<?php
$handle = popen('grep regex /path/to/file.txt', 'r');
$output = fread($handle, 2096);
pclose($handle);
?>

с использованием внешней утилиты grep. Вы можете дать некоторое переключение, чтобы сообщить положение (смещение), чтобы увидеть, где совпадение было найдено это работает так (на этот раз, используя exec вместо popen в демонстрационных целях):

<?php
exec('grep "REGEX" /path/to/file.txt -b', $result);
?>

это, вероятно, будет работать только в Linux ...

Если вы действительно хотите сделать это в php или это не работает для вас, не используйте file_get_contents или что-то подобное, но ищите файл. Мэйби, как это:

<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
if (preg_match('/pattern/', $buffer)) {
   echo "found pattern in $buffer\n";
}
    }
    fclose($handle);
}
?>

не тот буфер может быть обрезан на 4095 байт ... fgets читает построчно, но вы можете указать максимум.

0 голосов
/ 23 сентября 2010
if (preg_match('/pattern/', file_get_contents($file))) {
   echo "found pattern in $file\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...