2010-02-28 3 views

ответ

7

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

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

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

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

0

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

+1

несколько расширений можно сделать проще с: 'Глоб ('*. {ext1, ext2, ext3}', GLOB_BRACE) ' –

1

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

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

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

1

Вот простой пример того, как это могло быть достигнуто строго в 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(); 

?> 
0

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

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

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

Подробное описание overview of the Lucene Library приведено в справочнике Zend Framework.

1

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

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