2011-11-07 16 views
7

Quiero encontrar una cadena de texto específica en uno o más archivos de texto en un directorio, pero no sé cómo. Ya busqué en Google un tiempo bastante largo y no encontré nada. Por lo tanto, les pregunto a ustedes, ¿cómo puedo solucionar esto?Buscar texto específico en múltiples archivos TXT en PHP

Gracias de antemano.

Respuesta

5

Puede obtener lo que necesita sin el uso de grep. Grep es una herramienta útil para cuando estás en la línea de comandos, pero puedes hacer lo que necesitas con solo un poco de código PHP.

Este pequeño fragmento, por ejemplo, le da resultados similares a grep:

$path_to_check = ''; 
$needle = 'match'; 

foreach(glob($path_to_check . '*.txt') as $filename) 
{ 
    foreach(file($filename) as $fli=>$fl) 
    { 
    if(strpos($fl, $needle)!==false) 
    { 
     echo $filename . ' on line ' . ($fli+1) . ': ' . $fl; 
    } 
    } 
} 
+0

¡Gracias! Eso funcionó de maravilla, pero ¿cómo puedo obtener un "código" específico en una línea? Una línea se ve así: 'TME: ... | UID: ... | FNE: ... | MSG: ... | IPA: ...'. El "código" es, por ejemplo, 'UID'. – Erik

+0

Si te entiendo correctamente, 'if (strpos ($ line, '| UID:')! == false)' podría hacer lo que necesites. – ghbarratt

+0

¿Cómo debe estar el eco dentro de este si? – Erik

10

Si se trata de una máquina Unix que se está ejecutando en, puede realizar una llamada al sistema de grep en el directorio:

$search_pattern = "text to find"; 
$output = array(); 
$result = exec("/path/to/grep -l " . escapeshellarg($search_pattern) . " /path/to/directory/*", $output); 

print_r($output); 
// Prints a list of filenames containing the pattern 
+0

Estoy utilizando Windows :) Pero mi proveedor de alojamiento web utiliza Linux. ¿Es posible hacer que esto funcione en Windows también, así que puedo probarlo antes de subirlo a mi servidor web? – Erik

+1

Puede instalar grep para Windows http://gnuwin32.sourceforge.net/packages/grep.htm (y sus dependencias enumeradas en la misma página) –

1

Simplemente especifique un nombre de archivo, obtenga el contenido del archivo y haga corresponder la expresión regular con el contenido del archivo. Ver this y this para obtener más detalles con respecto a mi ejemplo de código a continuación:

$fileName = '/path/to/file.txt'; 
    $fileContents = file_get_contents($fileName); 
    $searchStr = 'I want to find this exact string in the file contents'; 

    if ($fileContents) { // file was retrieved successfully 

     // do the regex matching 
     $matchCount = preg_match_all($searchStr, $fileContents, $matches); 

     if ($matchCount) { // there were matches 
      // $match[0] will contain the entire string that was matched 
      // $matches[1..n] will contain the match substrings  
     } 

    } else { // file retrieval had problems 

    } 

Nota: Esto funciona independientemente de si está o no está en una máquina Linux.

Cuestiones relacionadas