¿Cómo analizaría un directorio para una línea de texto específica y enumeraría todos los archivos coincidentes con php?Buscar frase/palabra en archivos de texto con php
Gracias.
¿Cómo analizaría un directorio para una línea de texto específica y enumeraría todos los archivos coincidentes con php?Buscar frase/palabra en archivos de texto con php
Gracias.
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.
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.
Aquí es un ejemplo trivial de cómo esto podría llevarse a cabo estrictamente en php ...
obtener una lista de todos los ficheros/directorios dentro de un directorio.
Compruebe que cada nombre de archivo/dir es un archivo
Obtener el contenido de un archivo de
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();
?>
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.
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]);
$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;
múltiples extensiones se pueden hacer más fácil con: 'glob ('*. {ext1, ext2, ext3}', GLOB_BRACE) ' –