Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Lernpfade
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 Unit Test Generator
 TLD Liste
 Webkatalog‑Verzeichnis

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

PHP preg_grep(): Array-Einträge per Regex filtern

Sie befinden sich: Home > Php Tutorial > PHP preg_grep(): Array-Eint...

PHP preg_grep(): Array-Einträge per Regex filtern
Eintrag am:
21.07.2026
Hits / Besucher:
79
Sprache:
  Deutsch
Tutorial Art:
eigenes
Eingetragen von:
Merkliste:
 
Beschreibung

Beim Aufräumen von Listen taucht immer wieder dieselbe Aufgabe auf: Aus einem Array sollen nur die Einträge übrig bleiben, die zu einem bestimmten Muster passen. In PHP gibt es dafür eine spezialisierte Funktion, die genau das in einer einzigen Zeile erledigt. Dieses Tutorial zeigt, wie preg_grep() Arrays per regulärem Ausdruck filtert, wie sich die Auswahl mit PREG_GREP_INVERT umkehren lässt und wann array_filter() die bessere Wahl ist.

Was leistet preg_grep() in PHP?

Wer in PHP mit Arrays arbeitet und nur die Einträge behalten will, die einem bestimmten Muster entsprechen, hat zwei Standardwege. Eine foreach-Schleife mit preg_match() funktioniert, ist aber länger als nötig. PHP preg_grep erledigt das in einer Zeile: Die Funktion bekommt ein Array und einen regulären Ausdruck und gibt ein neues Array mit allen passenden Einträgen zurück.

Illustration zum Tutorial: PHP preg_grep(): Array-Einträge per Regex filtern

Bevor die Syntax und das Negations-Flag folgen, ein kurzer Blick auf typische Aufgabenstellungen, in denen die Funktion ihre Stärken ausspielt.

In der Praxis taucht diese Aufgabe überall dort auf, wo grobe Listen verfeinert werden. Ein Logfile-Array soll auf Fehlerzeilen reduziert werden. Aus einer Verzeichnisliste sollen nur die heutigen Logs übrig bleiben. Eine Eingabeliste soll auf gültige E-Mails gefiltert werden. Dieses Tutorial zeigt das Standard-Pattern, die Negation per PREG_GREP_INVERT und den Vergleich mit array_filter().

Syntax und Rückgabewert von PHP preg_grep

Die Signatur von PHP preg_grep ist kurz und gut zu merken. Ein Regex-Pattern, ein Array und optional ein Flag.

<?php

preg_grep(string $pattern, array $array, int $flags = 0): array|false

Bei Erfolg liefert die Funktion ein neues Array mit allen passenden Werten. Wichtig: Die Schlüssel des Eingabe-Arrays bleiben erhalten. Wer das Ergebnis von 0 an neu indexieren will, ruft anschließend array_values() auf. Der Rückgabewert bei einem syntaktisch ungültigen Pattern ist false, daher ist eine Prüfung mit === false sinnvoll, sobald das Pattern dynamisch zusammengebaut wird. Im Vergleich zu Schwesterfunktionen wie preg_replace (ersetzt Treffer) oder preg_split (zerlegt einen String) ist preg_grep auf das reine Filtern spezialisiert.

Einträge mit PHP preg_grep nach Präfix oder Suffix filtern

Das einfachste Beispiel für PHP preg_grep: Aus einer Liste von Paketnamen sollen nur die behalten werden, die mit php- beginnen. Das Pattern /^php-/ greift hier zuverlässig.

<?php

$tools = ['php-curl', 'php-cli', 'mysql-client', 'php-fpm'];
$treffer = preg_grep('/^php-/', $tools);

print_r($treffer);
/* Array ( [0] => php-curl [1] => php-cli [3] => php-fpm ) */

Beachten: Der Schlüssel [2] (mysql-client) fehlt im Ergebnis, weil dieser Wert nicht passt. Die anderen Indizes bleiben aber unverändert. Wer eine glatte 0-bis-N-Indexierung braucht, schreibt $treffer = array_values(preg_grep(...));. Ein Suffix-Filter funktioniert analog mit /\.php$/, also "endet auf .php". In Kombination mit preg_match aus unserem Regex-Tutorial lassen sich auch komplexere Vergleiche aufbauen.

Logfile-Zeilen mit PHP preg_grep und ERROR herausfiltern

Das wahrscheinlich häufigste Praxisbeispiel für PHP preg_grep ist das Filtern von Logdateien. Eine Logdatei wird mit file() zeilenweise eingelesen und anschließend mit preg_grep auf alle Zeilen reduziert, die das Wort ERROR enthalten.

<?php

$zeilen = file('app.log', FILE_IGNORE_NEW_LINES);
$fehler = preg_grep('/\bERROR\b/', $zeilen);

foreach ($fehler as $zeile) {
echo $zeile . "\n";
}

Die Word-Boundary \b sorgt dafür, dass auch Zeilen wie [ERROR] Verbindung verloren matchen, aber nicht MIRRORED oder andere Wörter, in denen der Buchstaben-Block ERROR zufällig vorkommt. Wer mit verschiedenen Log-Levels arbeitet, kann das Pattern erweitern: /\b(ERROR|FATAL|CRITICAL)\b/ matcht alle drei. Das Ergebnis ist ein Array mit den Original-Zeilennummern, was beim Debugging hilft, weil der Bezug zur Zeile in der Log-Datei erhalten bleibt.

PREG_GREP_INVERT als Negation in PHP preg_grep

Manchmal will man bei PHP preg_grep genau das Gegenteil: Alle Einträge behalten, die NICHT matchen. Das Flag PREG_GREP_INVERT dreht das Verhalten um.

<?php

$dateien = ['readme.md', 'config.php', 'index.php', 'license.txt'];
$keinPhp = preg_grep('/\.php$/', $dateien, PREG_GREP_INVERT);

print_r($keinPhp);
/* Array ( [0] => readme.md [3] => license.txt ) */

Praktisch ist das, wenn man eine Negation einfacher findet als ein "alles ausser"-Pattern. Statt eine komplizierte Lookahead-Regex zu bauen, schreibt man das positive Pattern und kehrt das Ergebnis um. Im Beispiel oben werden alle PHP-Dateien aus der Liste entfernt, übrig bleiben nur die Einträge, die das Pattern nicht treffen.

flowchart TD
    A[Input-Array] --> B[preg_grep mit Pattern]
    B --> C{Treffer pro Wert?}
    C -->|match| D[Wert ins Ergebnis]
    C -->|no match| E[Wert verwerfen]
    D --> F[Ergebnis-Array mit Original-Keys]
    E --> F

glob() und PHP preg_grep für Datei-Auswahl kombinieren

Die Funktion glob() liefert Dateipfade nach Wildcard-Muster, ist aber auf einfache Wildcards beschränkt. Sobald die Auswahl feiner wird, ist die Kombination glob + PHP preg_grep elegant.

<?php

$dateien = glob('logs/*.log');

/* Nur die Logs vom heutigen Tag */
$heute = preg_grep('/' . date('Y-m-d') . '/', $dateien);

/* Nur die Logs ohne 'test' im Namen */
$produktion = preg_grep('/test/', $heute, PREG_GREP_INVERT);

print_r($produktion);

Im Beispiel kommen erst alle Log-Dateien aus dem Verzeichnis, dann werden nur die mit dem heutigen Datum genommen, schließlich werden Test-Logs ausgeschlossen. Mit drei Aufrufen ist eine ziemlich präzise Auswahl gebaut, ohne eine einzige Schleife.

PHP preg_grep vs array_filter mit Closure

Das gleiche Ergebnis von PHP preg_grep ließe sich auch mit array_filter() und einer Closure erzielen. Wer alle Treffer eines regulären Ausdrucks innerhalb eines einzelnen Strings braucht, greift dagegen zu preg_match_all. Der Vergleich macht klar, warum preg_grep() oft die kompaktere Wahl ist, wenn ein Array gefiltert werden soll und nicht ein einzelner Text durchsucht werden soll.

<?php

$emails = ['info@a.de', 'spam@b.com', 'kontakt@a.de'];

/* Mit preg_grep */
$kompakt = preg_grep('/@a\.de$/', $emails);

/* Mit array_filter und Closure */
$ausgeschrieben = array_filter($emails, fn ($e) => preg_match('/@a\.de$/', $e));

print_r($kompakt);
print_r($ausgeschrieben);

Beide liefern dasselbe Ergebnis. Was spricht für welche Variante?

Aspektpreg_greparray_filter mit Closure
Lesbarkeit bei Regex-Filtersehr knappetwas geschwätziger
Performance bei vielen Einträgenmeist schneller (intern in C)Callback-Overhead pro Element
Flexibilitätnur Regex auf Wertebeliebige Logik, auch auf Keys
NegationPREG_GREP_INVERTnormale !-Negation in der Closure

Solange es nur um eine Regex-Prüfung pro Wert geht, ist preg_grep die direkte Wahl. Sobald die Filterlogik komplexer wird (mehrere Bedingungen, Prüfung der Schlüssel), passt array_filter mit einer Closure besser, weil dort beliebige Logik möglich ist.

Stolperfallen bei PHP preg_grep: Schlüssel-Erhalt und Fehlerwert

Drei Punkte rund um PHP preg_grep überraschen Anfänger immer wieder. Erstens: Die Schlüssel bleiben erhalten. Wer den Output an eine Funktion weitergibt, die [0], [1], [2] erwartet, sollte nach preg_grep ein array_values() einschieben. Sonst überspringt eine for ($i = 0; ...)-Schleife im Worst Case alle Einträge.

<?php

$arr = ['php', 'mysql', 'apache', 'nginx'];
$treffer = preg_grep('/^p/', $arr);

/* $treffer ist jetzt [0 => 'php']; foreach geht, for nicht */
$normal = array_values($treffer);

print_r($normal);
/* Array ( [0] => php ) mit konsistenter Indexierung */

Zweitens: Bei einem ungültigen Pattern (etwa /[a-z/ ohne schließende Klammer) liefert preg_grep den Wert false. Eine kurze Prüfung mit === false schützt nachfolgende Aufrufe vor "Argument is not an array"-Fehlern.

Drittens: PHP preg_grep prüft nur die Werte, nicht die Schlüssel. Wer assoziative Arrays nach Schlüssel filtern will, muss array_filter() mit ARRAY_FILTER_USE_KEY nutzen oder vorher mit array_keys() die Keys extrahieren, das Ergebnis filtern und mit array_intersect_key zurück-mappen.

Fazit zu PHP preg_grep

PHP preg_grep ist die kompakteste Variante in PHP, um ein Array per Regex zu filtern. PHP preg_grep ist intern in C implementiert und damit meist schneller als die äquivalente array_filter mit Closure. Mit dem Flag PREG_GREP_INVERT lässt sich die Logik in einem Schritt umkehren. Klassische Einsatzfälle sind Logfile-Filter, Datei-Auswahl in Kombination mit glob() und Eingabe-Säuberung. Im Zusammenspiel mit den weiteren Regex-Funktionen wie preg_match, preg_replace, preg_split und preg_match_all deckt sie das letzte Puzzlestück für Array-basierte Filterungen ab. Wer die Schlüssel-Erhaltung im Blick behält und bei dynamischen Patterns auf den false-Rückgabewert prüft, kann die Funktion in jedem Skript zuverlässig einsetzen.

 

Tags:

 

 

Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.