2010-02-28 12 views

Respuesta

7

De hecho, me escribió una función para esto hace unos días ...

Aquí está la función de base que escanea cada archivo ...

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

No es la forma más avanzada de hacerlo, mi la función es mucho más larga pero también usa todas las funciones de mis otras clases, esto es básicamente lo que hace.

0

Bueno, primero es posible que desee obtener una lista de los archivos de interés con glob (si desea varias extensiones, simplemente combine las matrices resultantes o use this). Luego recorra el resultado, abra los archivos con file_get_contents y verifique su cadena con strpos.

+1

múltiples extensiones se pueden hacer más fácil con: 'glob ('*. {ext1, ext2, ext3}', GLOB_BRACE) ' –

1

Una alternativa es leer los archivos php, poner el contenido en matrices y usar algo como preg_grep.

Si el número de archivos es potencialmente muy grande, es posible que desee utilizar el comando UNIX grep junto con un php exec.

Personalmente, buscaría la segunda solución.

1

Aquí es un ejemplo trivial de cómo esto podría llevarse a cabo estrictamente en php ...

  1. obtener una lista de todos los ficheros/directorios dentro de un directorio.

  2. Compruebe que cada nombre de archivo/dir es un archivo

  3. Obtener el contenido de un archivo de

  4. Utilice una función de búsqueda de cadenas para buscar coincidencias de la cadena que estamos buscando. Si existe una coincidencia, imprimir el nombre del archivo

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

No voy a poner mi respuesta recomendado aquí, porque 5 personas ya han publicado grandes respuestas sobre cómo resolver esto, pero lo hará recomendar una alternativa

¿Ha considerado utilizar la implementación PHP del motor de búsqueda Lucene? El más notable es del Zend Framework. Lo mejor es que no tiene que usar el marco para usar la biblioteca Lucene (solo incluya el archivo base de la biblioteca, recordando agregar el directorio Zend Libraries a la ruta include).

No lo he usado yo mismo, y he escuchado críticas muy variadas al respecto. Lo único que se me ocurre es que puede ser demasiado complejo para un pequeño guión o proyecto.

Un gran detalle overview of the Lucene Library se encuentra en la guía de referencia de Zend Framework.

1

Si los archivos son grandes, es excesivo tener que leer cada archivo en la memoria y luego buscar sus contenidos.

Si ha leído permisos sobre el directorio, se puede averiguar el archivo en el que la aguja se encuentra mediante la combinación de exec con 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; 
Cuestiones relacionadas