Как сканировать каталог для определенной строки текста и отображать все соответствующие файлы с помощью php?
Благодарю.
Я на самом деле написал функцию для этого несколько дней назад …
Вот базовая функция, которая сканирует каждый файл …
foreach (glob("<directory>/*.txt") as $search) { $contents = file_get_contents($search); if (!strpos($contents, "text")) continue; $matches[] = $search; }
Не самый продвинутый способ сделать это, моя функция намного длиннее, но она также использует все функции из моих различных классов, это в основном то, что она делает.
Альтернативой является чтение файлов php, размещение содержимого в массивы и использование чего-то типа preg_grep .
Если количество файлов потенциально очень велико, вы можете использовать команду grep UNIX вместе с php exec .
Я бы лично пошел на второе решение.
Вот тривиальный пример того, как это можно выполнить строго в php …
Получить список всех файлов / каталогов в каталоге.
Убедитесь, что каждое имя файла / dir является файлом
Получить содержимое файла
Используйте функцию поиска строк для поиска совпадений строки, которую мы ищем. Если существует совпадение, напечатайте имя файла
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(); ?>
Если файлы большие, то излишнему приходится считывать каждый файл в память, а затем искать его коннекты.
Если у вас есть права на чтение по каталогу, вы можете определить файл, где расположена игла, путем объединения 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]);
Ну, сначала вы можете получить список интересующих файлов с glob (если вы хотите несколько расширений, просто слейте результирующие массивы или используйте это ). Затем проведите через результат, откройте файлы с помощью file_get_contents и проверьте свою строку с strpos .
Я не стану предлагать свой рекомендуемый ответ, потому что 5 человек уже опубликовали отличные ответы на вопрос о том, как это решить, но порекомендуют альтернативу.
Рассматривали ли вы использование PHP-реализации Lucene Search Engine? Наиболее заметным является Zend Framework . Лучше всего, что вам не нужно использовать фреймворк для использования библиотеки Lucene (просто включите базовый файл библиотеки – помните, чтобы добавить каталог Zend Libraries в путь include).
Я не использовал его сам и слышал очень неоднозначные отзывы об этом. Единственное, что я мог подумать, это то, что он может быть слишком сложным для небольшого скрипта или проекта.
Подробный обзор библиотеки Lucene представлен в справочном руководстве Zend Framework.
$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;