preg_grep()
La funzione preg_grep() in PHP filtra un array mantenendo solo gli elementi che corrispondono a un'espressione regolare PCRE.
Introduzione
preg_grep() filtra un array, mantenendo solo gli elementi che corrispondono (o, facoltativamente, non corrispondono) a un'espressione regolare. È il membro orientato agli array della famiglia PCRE di PHP: invece di testare una singola stringa come preg_match(), itera su ogni elemento di un array e restituisce un nuovo array con gli elementi che superano il test.
Questa pagina illustra la firma della funzione e i suoi parametri, la differenza tra corrispondenza normale e invertita, il comportamento delle chiavi restituite, casi d'uso comuni e le insidie da evitare.
Sintassi
preg_grep(string $pattern, array $array, int $flags = 0): array|falseLa funzione accetta tre parametri:
$pattern— un pattern PCRE, scritto come stringa con delimitatori (ad es./^g/,~\d+~,#error#i).$array— l'array di input da filtrare. Vengono testati solo i suoi valori, mai le chiavi.$flags(opzionale) — passa la costantePREG_GREP_INVERTper restituire gli elementi che non corrispondono. Il valore predefinito è0(restituisce gli elementi corrispondenti).
Restituisce un nuovo array contenente gli elementi corrispondenti, preservando le chiavi originali. Se il pattern non è valido, restituisce false e genera un avviso.
Esempio base
preg_grep() scorre l'array e mantiene ogni valore che corrisponde al pattern. Qui manteniamo solo i colori che iniziano con la lettera g:
Output:
Array
(
[2] => green
)Notate la chiave: green si trovava all'indice 2 nell'input, e preg_grep() mantiene quella chiave nel risultato. L'array restituito non viene reindicizzato — se avete bisogno di chiavi sequenziali, avvolgete la chiamata in array_values().
Filtraggio con PREG_GREP_INVERT
Passate PREG_GREP_INVERT come terzo argomento per invertire la logica: otterrete gli elementi che non corrispondono al pattern. Questo è utile per i task di tipo "rimuovi le voci errate". Qui eliminiamo ogni stringa che contiene una cifra:
<?php
$entries = ["apple1", "banana", "cherry7", "date", "fig2"];
$result = preg_grep("/[0-9]/", $entries, PREG_GREP_INVERT);
print_r($result);Output:
Array
(
[1] => banana
[3] => date
)Solo banana e date sopravvivono perché non contengono cifre — e anche in questo caso le chiavi originali (1 e 3) vengono preservate.
Casi d'uso pratici
Filtrare le righe di log per livello
Un'operazione comune è estrarre solo le righe di errore da un elenco di voci di log. Un pattern ancorato con distinzione tra maiuscole e minuscole garantisce precisione:
<?php
$logs = [
"INFO ok",
"ERROR disk full",
"WARN low mem",
"ERROR timeout",
];
$errors = preg_grep("/^ERROR/", $logs);
print_r($errors);Output:
Array
(
[1] => ERROR disk full
[3] => ERROR timeout
)Mantenere solo le stringhe interamente numeriche
Durante la validazione di input misto, preg_grep() permette di tenere solo i valori che corrispondono a una forma precisa in una singola riga. Gli ancoraggi ^\d+$ assicurano che l'intera stringa sia composta da cifre:
<?php
$mixed = ["12", "ab", "3x", "99"];
$nums = preg_grep("/^\d+$/", $mixed);
print_r($nums);Output:
Array
(
[0] => 12
[3] => 99
)Insidie e consigli
- Le chiavi vengono preservate, non azzerate. Come mostrato sopra, le lacune nelle chiavi del risultato sono normali. Usate
array_values()se avete bisogno di0, 1, 2, …. - Vengono testati solo i valori.
preg_grep()ignora completamente le chiavi dell'array — non esiste una variante basata sulle chiavi. - I pattern non validi restituiscono
false, non un array vuoto. Verificate sempre il tipo del risultato se il pattern proviene dall'input dell'utente:if ($result === false) { /* bad pattern */ }. - Non modifica l'input. Come la maggior parte delle funzioni PHP per gli array, restituisce un nuovo array e lascia
$arrayinvariato. - I valori non stringa vengono convertiti. Numeri e altri scalari vengono convertiti in stringhe prima della corrispondenza, quindi
preg_grep("/^1/", [10, 20])corrisponde a10.
Funzioni correlate
preg_match()— testa una singola stringa rispetto a un pattern.preg_match_all()— trova tutte le corrispondenze all'interno di una stringa.preg_replace()— cerca e sostituisce usando un pattern.preg_split()— suddivide una stringa in un array tramite un pattern.preg_filter()— comepreg_replace()ma restituisce solo i soggetti corrispondenti.
Conclusione
preg_grep() è il modo più diretto per filtrare un array con un'espressione regolare in PHP. Usatela da sola per mantenere gli elementi corrispondenti, aggiungete PREG_GREP_INVERT per rimuoverli, e ricordate che preserva le chiavi originali. Per la corrispondenza su una singola stringa usate preg_match(); per la sostituzione usate preg_replace().