Поиск фразы / слова в текстовых файлах с помощью php

Как сканировать каталог для определенной строки текста и отображать все соответствующие файлы с помощью 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 …

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

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

  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(); ?> 

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

Если у вас есть права на чтение по каталогу, вы можете определить файл, где расположена игла, путем объединения 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;