2012-05-19 13 views
7

Esiste una funzione in PHP che utilizza grep -f nomefile nei sistemi unix/linux. Se non ce n'è, le funzioni/strumenti PHP potrebbero aiutare a creare un metodo/funzione personalizzato per questo. Grazie!grep con -f come in PHP

risposta

9

In realtà secondo me, io direi che è il seguente:

$result = preg_grep($pattern, file($path)); 

Vedi preg_grep­Docs e file­Docs.

Se avete bisogno di farlo (ricorsivamente) su una serie di file, v'è anche glob e foreach o (Recursive) DirectoryIterator o il GlobIterator­Docs e non dimenticare il RegexIterator­Docs.


Esempio con SplFileObject e RegexIterator:

$stream = new SplFileObject($file); 
$grepped = new RegexIterator($stream, $pattern); 

foreach ($grepped as $line) { 
    echo $line; 
} 

uscita (tutte le linee di $file contenenti $ modello):

$grepped = new RegexIterator($stream, $pattern); 
foreach ($grepped as $line) { 
    echo $line; 
} 

Demo: https://eval.in/208699

+0

Mentre questo è funzionalmente equivalente, carica l'intero file in memoria, mentre la riga di comando grep non lo fa. – cmc

+0

@cmd: Sì, se vuoi risparmiare memoria, considera [** SplFileObject **] (http://php.net/SplFileObject) e [** RegexIterator **] (http://php.net/ RegexIterator). – hakre

+0

suona bene! ... non ti capita di avere un esempio a portata di mano che è una sostituzione drop-in per preg_grep ($ pattern, file ($ path))? – cmc

2

È possibile combinare la funzione file_get_contens() per aprire un file e la funzione preg_match_all() per acquisire i contenuti mediante un'espressione regolare.

$file = file_get_contents ('path/to/file.ext'); 
preg_match_all ('regex_pattern_here', $file, $matches); 
print_r ($matches); 
+0

Sto usando 'file_get_contents()' ma fallisce a intermittenza. – FractalSpace