2012-05-19 6 views
7

Gibt es eine solche Funktion in PHP, die grep -f Dateiname in Unix/Linux-Systemen tut. Wenn es keine gibt, würden die PHP-Funktionen/Tools dazu beitragen, eine angepasste Methode/Funktion dafür zu erstellen. Vielen Dank!grep mit -f wie in PHP

Antwort

9

Eigentlich IMHO, würde ich sagen, es ist die folgende:

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

Siehe preg_grep­Docs und file­Docs.

Wenn Sie diese (rekursiv) tun müssen, über eine Reihe von Dateien, gibt es auch glob und foreach oder die (Recursive) DirectoryIterator oder die GlobIterator­Docs und nicht die RegexIterator­Docs zu vergessen.


Beispiel mit SplFileObject und RegexIterator:

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

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

Output (alle Linien von $file $ Muster enthält):

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

Demo: https://eval.in/208699

+0

Während dies funktional äquivalent ist, lädt es die gesamte Datei in den Speicher, während die Befehlszeile grep nicht. – cmc

+0

@cmd: Ja, wenn Sie Speicher sparen möchten, beachten Sie bitte [** SplFileObject **] (http://php.net/SplFileObject) und [** RegexIterator **] (http://php.net/ RegexIterator). – hakre

+0

hört sich gut an! ... Sie hätten nicht zufällig ein Beispiel, das ein Ersatz für preg_grep ($ pattern, file ($ path)) ist? – cmc

2

Sie können die Funktion file_get_contens() kombinieren, um eine Datei zu öffnen, und die Funktion preg_match_all(), um Inhalte mit einem Regex zu erfassen.

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

Ich habe 'file_get_contents()' benutzt, aber es schlägt periodisch fehl. – FractalSpace