preg_grep()
Die PHP-Funktion preg_grep() filtert ein Array und behält nur die Elemente, die einem regulären Ausdruck entsprechen.
Einführung
preg_grep() filtert ein Array und behält nur die Elemente, die einem regulären Ausdruck entsprechen (oder optional nicht entsprechen). Sie ist das array-orientierte Mitglied der PCRE-Familie von PHP: Statt eine einzelne Zeichenkette wie preg_match() zu testen, durchläuft sie jedes Element eines Arrays und gibt ein neues Array mit den Elementen zurück, die den Test bestehen.
Diese Seite behandelt die Signatur und Parameter der Funktion, den Unterschied zwischen normaler und invertierter Übereinstimmung, das Verhalten der zurückgegebenen Schlüssel, häufige Anwendungsfälle in der Praxis und bekannte Fallstricke.
Syntax
preg_grep(string $pattern, array $array, int $flags = 0): array|falseDie Funktion akzeptiert drei Parameter:
$pattern— ein PCRE-Muster, als Zeichenkette mit Trennzeichen geschrieben (z. B./^g/,~\d+~,#error#i).$array— das zu filternde Eingabe-Array. Nur seine Werte werden geprüft, niemals seine Schlüssel.$flags(optional) — die KonstantePREG_GREP_INVERTübergeben, um die Elemente zurückzugeben, die nicht übereinstimmen. Standardmäßig0(übereinstimmende Elemente zurückgeben).
Die Funktion gibt ein neues Array mit den übereinstimmenden Elementen zurück und bewahrt dabei die ursprünglichen Schlüssel. Wenn das Muster ungültig ist, gibt sie false zurück und gibt eine Warnung aus.
Einfaches Beispiel
preg_grep() durchläuft das Array und behält jeden Wert, der dem Muster entspricht. Hier behalten wir nur die Farben, die mit dem Buchstaben g beginnen:
Ausgabe:
Array
(
[2] => green
)Beachten Sie den Schlüssel: green befand sich an Index 2 im Eingabe-Array, und preg_grep() behält diesen Schlüssel im Ergebnis. Das zurückgegebene Array wird daher nicht neu indiziert — wenn Sie aufeinanderfolgende Schlüssel benötigen, verwenden Sie array_values().
Filtern mit PREG_GREP_INVERT
Übergeben Sie PREG_GREP_INVERT als drittes Argument, um die Logik umzukehren: Sie erhalten die Elemente zurück, die das Muster nicht erfüllen. Dies ist nützlich für Aufgaben wie „fehlerhafte Einträge entfernen". Hier entfernen wir jede Zeichenkette, die eine Ziffer enthält:
<?php
$entries = ["apple1", "banana", "cherry7", "date", "fig2"];
$result = preg_grep("/[0-9]/", $entries, PREG_GREP_INVERT);
print_r($result);Ausgabe:
Array
(
[1] => banana
[3] => date
)Nur banana und date überleben, da sie keine Ziffern enthalten — und auch hier werden ihre ursprünglichen Schlüssel (1 und 3) beibehalten.
Praktische Anwendungsfälle
Log-Zeilen nach Level filtern
Eine häufige Aufgabe ist das Herausfiltern von Fehlerzeilen aus einer Liste von Log-Einträgen. Ein groß-/kleinschreibungssensitives, verankertes Muster sorgt für Präzision:
<?php
$logs = [
"INFO ok",
"ERROR disk full",
"WARN low mem",
"ERROR timeout",
];
$errors = preg_grep("/^ERROR/", $logs);
print_r($errors);Ausgabe:
Array
(
[1] => ERROR disk full
[3] => ERROR timeout
)Nur vollständig numerische Zeichenketten behalten
Bei der Validierung gemischter Eingaben ermöglicht preg_grep(), in einer einzigen Zeile nur die Werte zu behalten, die einer strengen Form entsprechen. Die Anker ^\d+$ stellen sicher, dass die gesamte Zeichenkette aus Ziffern besteht:
<?php
$mixed = ["12", "ab", "3x", "99"];
$nums = preg_grep("/^\d+$/", $mixed);
print_r($nums);Ausgabe:
Array
(
[0] => 12
[3] => 99
)Fallstricke und Tipps
- Schlüssel werden beibehalten, nicht zurückgesetzt. Wie oben gezeigt, sind Lücken in den Ergebnisschlüsseln normal. Verwenden Sie
array_values(), wenn Sie0, 1, 2, …benötigen. - Nur Werte werden geprüft.
preg_grep()ignoriert Array-Schlüssel vollständig — es gibt keine schlüsselbasierte Variante. - Ungültige Muster geben
falsezurück, kein leeres Array. Überprüfen Sie immer den Ergebnistyp, wenn das Muster aus Benutzereingaben stammt:if ($result === false) { /* bad pattern */ }. - Das Eingabe-Array wird nicht verändert. Wie die meisten PHP-Array-Hilfsfunktionen gibt sie ein neues Array zurück und lässt
$arrayunberührt. - Nicht-String-Werte werden konvertiert. Zahlen und andere skalare Werte werden vor dem Abgleich in Zeichenketten umgewandelt, sodass
preg_grep("/^1/", [10, 20])den Wert10trifft.
Verwandte Funktionen
preg_match()— eine einzelne Zeichenkette gegen ein Muster testen.preg_match_all()— alle Übereinstimmungen innerhalb einer Zeichenkette finden.preg_replace()— suchen und ersetzen mit einem Muster.preg_split()— eine Zeichenkette anhand eines Musters in ein Array aufteilen.preg_filter()— wiepreg_replace(), gibt aber nur übereinstimmende Themen zurück.
Fazit
preg_grep() ist die einfachste Methode, ein Array in PHP gegen einen regulären Ausdruck zu filtern. Verwenden Sie sie allein, um übereinstimmende Elemente zu behalten, fügen Sie PREG_GREP_INVERT hinzu, um sie zu entfernen, und beachten Sie, dass die ursprünglichen Schlüssel erhalten bleiben. Für den Abgleich einzelner Zeichenketten verwenden Sie preg_match(); für Ersetzungen verwenden Sie preg_replace().