2012-05-19 10 views
7

Czy istnieje taka funkcja w PHP, która robi grep -f filename w systemach unix/linux. Jeśli nie ma, to jakie funkcje/narzędzia PHP pomogłyby w stworzeniu niestandardowej metody/funkcji do tego. Dzięki!grep z -f jak w PHP

Odpowiedz

9

Właściwie IMHO, powiedziałbym, że to, co następuje:

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

Zobacz preg_grep­Docs i file­Docs.

Jeśli trzeba zrobić (rekurencyjnie) przez zestaw plików, istnieje również glob i foreach lub (Recursive) DirectoryIterator lub GlobIterator­Docs i nie zapomnieć o RegexIterator­Docs.


Przykład z SplFileObject i RegexIterator:

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

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

wyjściowego (wszystkie linie $file zawierające $ wzorca):

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

Demo: https://eval.in/208699

+0

Chociaż jest to równoważne funkcjonalnie, ładuje cały plik do pamięci, podczas gdy grep z linii poleceń nie. – cmc

+0

@cmd: Tak, jeśli chcesz zaoszczędzić pamięć, rozważ [** SplFileObject **] (http://php.net/SplFileObject) i [** RegexIterator **] (http://php.net/ RegexIterator). – hakre

+0

brzmi dobrze! ... nie miałbyś takiego przykładu, który byłby zamiennikiem dla preg_grep ($ pattern, file ($ path))? – cmc

2

Możesz połączyć funkcję file_get_contens(), aby otworzyć plik i funkcję preg_match_all(), aby przechwytywać zawartość za pomocą wyrażenia regularnego.

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

Używam 'file_get_contents()', ale nie działa sporadycznie. – FractalSpace