Buscar fichero por nombre con PHP
Si necesitas implementar un pequeño buscador en tu web o aplicación, que busque en un directorio según un nombre, puedes hacerlo con la siguiente función de PHP.
Buscar en nombre de archivo
/**
* Recursively match directory and file names.
*
* @param str $src Directory in search
* @param str $str String to search
*
* @return array
*/
function searchInDirAndFilename($src, $str){
$result = array();
$exclude = array('.', '..');
$handler = opendir($src);
while ($file = readdir($handler)) {
/* Avoid . and .. */
if(!in_array($file, $exclude)){
$full = $src . '/' . $file;
if(is_dir($full)){
/* Find a match in directory name */
if(strpos(strtolower($full), strtolower($str)) !== false){
$result[] = array(
"type" => "dir",
"name" => $full,
);
}
/* Evaluate subdirectories */
$subresults = searchInDirAndFilename($full, $str);
if(count($subresults) > 0) $result = array_merge($result, $subresults);
}else{
/* Find a match in file name */
if(strpos(strtolower($full), strtolower($str)) !== false){
$result[] = array(
"type" => "file",
"name" => $full,
);
}
}
}
}
closedir($handler);
return $result;
}
$results = searchInDirAndFilename("data", "factura-45874012");
A esta función le pasaremos dos parámetros. El primero indica el nombre del directorio (o la ruta) en dónde buscar, y como segundo parámetro la cadena de texto que se debe buscar.
Buscar en el contenido del archivo
Esta función nos servirá para buscar en el interior de determinados archivos una cadena.
/**
* Recursively match directory and file names.
*
* @param str $src Directory in search
* @param str $str String to search
*
* @return array
*/
function searchStrInFile($src, $str){
$result = array();
/* Allowed files extension to search */
$allowedExtensions = array("txt", "csv", "html", "js", "css");
$handler = opendir($src);
while ($file = readdir($handler)) {
/* Avoid . and .. */
if(in_array($file, array('.', '..'))) continue;
$full = $src . '/' . $file;
if(is_dir($full)){
/* Evaluate subdirectories */
$subResults = searchStrInFile($full, $str);
if(count($subResults) > 0) $result = array_merge($result, $subResults);
}else{
/* Find a match in file content */
$fileinfo = pathinfo($full);
$allowExtension = in_array($fileinfo["extension"], $allowedExtensions);
$content = file_get_contents($full);
$match = strpos(strtolower($content), strtolower($str));
if($match !== false AND $allowExtension) $result[] = $full;
}
}
closedir($handler);
return $result;
}
$results = searchStrInFile("data", "El expediente ");
De igual forma que en la función anterior, deberemos pasar dos parámetros, el nombre del directorio o ruta y la cadena a buscar.
En este caso, se limita por extensión de los ficheros en cuáles se puede buscar.
Recursividad
Tanto en la primera función como en la segunda, se utiliza la recursividad para escanear los subdirectorios.