Поиск фразы / слова в текстовых файлах с помощью php - PullRequest
5 голосов
/ 28 февраля 2010

Как мне отсканировать каталог на наличие определенной строки текста и перечислить все подходящие файлы с помощью php?

Спасибо.

Ответы [ 7 ]

7 голосов
/ 28 февраля 2010

Я действительно написал функцию для этого несколько дней назад ...

Вот базовая функция, которая сканирует каждый файл ...

foreach (glob("<directory>/*.txt") as $search) {
    $contents = file_get_contents($search);
    if (!strpos($contents, "text")) continue;
    $matches[] = $search;
}

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

1 голос
/ 09 сентября 2013

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

Если у вас есть права на чтение для каталога, вы можете выяснить файл, в котором находится игла, комбинируя exec с egrep :

php > exec("egrep -rl 'string of what I want to find' full-or-relative-directory", $output);
php > print_r($output);
Array
(
  [0] => full-or-relative-directory/foo/bar.xml
)
php > $contents = file_get_contents($output[0]);
1 голос
/ 28 февраля 2010

Вот тривиальный пример того, как это может быть сделано строго в php ...

  1. Получить список всех файлов / каталогов в каталоге.

  2. Убедитесь, что каждое имя файла / каталога является файлом

  3. Получить содержимое файла

  4. Используйте функцию поиска строки для поиска совпадений искомой строки. Если совпадение существует, выведите имя файла

Meep

<?php
$path = 'c:\\some\\cool\\directory';
$findThisString = 'Cool Cheese';

$dir = dir($path);

// Get next file/dir name in directory
while (false !== ($file = $dir->read()))
{   
    if ($file != '.' && $file != '..')
    {
        // Is this entry a file or directory?
        if (is_file($path . '/' . $file))
        {
            // Its a file, yay! Lets get the file's contents
            $data = file_get_contents($path . '/' . $file);

            // Is the str in the data (case-insensitive search)
            if (stripos($data, $findThisString) !== false)
            {
                // sw00t! we have a match
            echo 'match found in ' . $file . "<br>\n";
            }
        }
    }
}

$dir->close();

?>
1 голос
/ 28 февраля 2010

Альтернативой является чтение php-файлов, размещение содержимого в массивах и использование чего-то вроде preg_grep .

Если число файлов потенциально очень большое, вы можете использовать команду UNIX grep вместе с php exec .

Я бы лично выбрал второе решение.

0 голосов
/ 21 июля 2014
$directory = "/var/www/application/store/"; //define the path
$files1 = scandir($directory); //scandir will scan the directory 
$c = count($files1); //this will count all the files in the directory
print $c; 
0 голосов
/ 28 февраля 2010

Я не буду помещать рекомендованный ответ здесь, потому что 5 человек уже опубликовали отличные ответы о том, как решить эту проблему, но порекомендуют альтернативу.

Рассматривали ли вы использование PHP-реализации поисковой системы Lucene? Наиболее заметным из них является Zend Framework . Лучше всего то, что вам не нужно использовать инфраструктуру для использования библиотеки Lucene (просто включите базовый файл библиотеки - не забудьте добавить каталог Zend Libraries в путь включения).

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

Подробный обзор библиотеки Lucene приведен в справочном руководстве Zend Framework.

0 голосов
/ 28 февраля 2010

Ну, во-первых, вы можете получить список интересующих файлов с помощью glob (если вам нужно несколько расширений, просто объедините полученные массивы или используйте this ). Затем переберите результат, откройте файлы с помощью file_get_contents и проверьте строку с помощью strpos .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...