W3docs

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|false

La 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 costante PREG_GREP_INVERT per 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:

php— editable, runs on the server

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 di 0, 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 $array invariato.
  • I valori non stringa vengono convertiti. Numeri e altri scalari vengono convertiti in stringhe prima della corrispondenza, quindi preg_grep("/^1/", [10, 20]) corrisponde a 10.

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() — come preg_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().

Esercizio

Pratica
Qual è la funzione di preg_grep in PHP?
Qual è la funzione di preg_grep in PHP?
Was this page helpful?