W3docs

Comprendere la funzione preg_filter di PHP

La funzione preg_filter in PHP consente di cercare e sostituire testo tramite espressioni regolari, restituendo solo le voci in cui si è verificata una corrispondenza.

La funzione preg_filter in PHP cerca in una stringa (o in un array di stringhe) il testo che corrisponde a un'espressione regolare e lo sostituisce. La sua caratteristica principale è che restituisce solo le voci in cui si è verificata una corrispondenza — le voci non corrispondenti vengono scartate. Questo la rende ideale quando si vuole cercare, sostituire e filtrare in un unico passaggio.

Se hai già usato preg_replace, preg_filter ti risulterà familiare: la sintassi è identica. L'unica differenza comportamentale — ciò che accade ai soggetti non corrispondenti — è ciò che rende preg_filter la scelta giusta, ed è il tema centrale di questa pagina.

In questo articolo tratteremo la sintassi, i parametri, le differenze tra preg_filter e preg_replace, e i casi d'uso più comuni, ciascuno con un esempio eseguibile.

Sintassi e Parametri

La sintassi della funzione preg_filter è la seguente:

Sintassi PHP preg_filter

preg_filter(pattern, replacement, subject [, limit [, count]])

I parametri sono i seguenti:

  • pattern: è il pattern dell'espressione regolare che specifica il testo da cercare.
  • replacement: è il testo che sostituirà il testo corrispondente nel soggetto.
  • subject: è la stringa in cui si vuole cercare e sostituire il testo.
  • limit (opzionale): il numero massimo di sostituzioni per stringa soggetto. Il valore predefinito è -1 (nessun limite).
  • count (opzionale): una variabile passata per riferimento che verrà riempita con il numero totale di sostituzioni effettuate.

Gli argomenti pattern, replacement e subject possono essere un valore singolo o un array, esattamente come con preg_replace. Il valore restituito è una stringa quando subject è una stringa, e un array quando subject è un array.

preg_filter vs. preg_replace

Le due funzioni accettano gli stessi argomenti e svolgono lo stesso lavoro di ricerca e sostituzione. La differenza sta in ciò che restituiscono quando un soggetto non corrisponde al pattern:

  • preg_replace restituisce il soggetto invariato.
  • preg_filter restituisce null per un soggetto stringa, e omette del tutto la voce per un soggetto array.
<?php
$input = ["123", "abc", "456"];

// preg_replace keeps every element, matched or not.
print_r(preg_replace("/\d+/", "[num]", $input));
// Array ( [0] => [num] [1] => abc [2] => [num] )

// preg_filter drops the non-matching "abc".
print_r(preg_filter("/\d+/", "[num]", $input));
// Array ( [0] => [num] [2] => [num] )
?>

Si noti che preg_filter conserva le chiavi originali (0 e 2) — non reindicizza l'array.

Casi d'uso

preg_filter è più utile quando si ha bisogno di cercare, sostituire e filtrare contemporaneamente. I casi d'uso più comuni includono:

  • Filtrare array: passare un array di stringhe e ottenere solo gli elementi che corrispondono al pattern.
  • Rimuovere tag HTML: eliminare i tag da stringhe o array di stringhe.
  • Estrarre e riformattare: sostituire il testo corrispondente scartando le voci che non contengono nulla di interesse.

Esempio: Rimozione dei tag HTML

In questo esempio, useremo preg_filter per rimuovere i tag HTML da una stringa:

Esempio PHP preg_filter

php— editable, runs on the server

In questo esempio, utilizziamo il pattern dell'espressione regolare /<[^>]+>/ per trovare tutti i tag HTML nella stringa $html. Il parametro replacement è impostato su una stringa vuota, quindi il testo corrispondente viene rimosso. Il testo risultante viene poi memorizzato nella variabile $text e visualizzato sullo schermo.

Esempio: Filtraggio degli elementi di un array

preg_filter eccelle quando si lavora con gli array perché rimuove gli elementi non corrispondenti:

<?php
$items = ["apple", "banana", "apricot", "cherry"];
$filtered = preg_filter("/^a/", "A", $items);
print_r($filtered);
// Outputs:
// Array
// (
//     [0] => Apple
//     [2] => Apricot
// )
?>

In questo esempio, preg_filter sostituisce la "a" iniziale con "A" ma rimuove automaticamente "banana" e "cherry" perché non corrispondono al pattern. Gli elementi mantenuti conservano le loro chiavi originali (0 e 2).

Contare le sostituzioni con il parametro count

Il quinto parametro opzionale viene riempito per riferimento con il numero di sostituzioni effettuate, il che è utile per la reportistica o per ramificare in base al fatto che qualcosa abbia o meno trovato corrispondenza:

<?php
$subject = "Order #42 and order #7";
$result = preg_filter("/#(\d+)/", "[$1]", $subject, -1, $count);
echo $result . "\n";   // Order [42] and order [7]
echo $count . "\n";    // 2
?>

Qui $1 nella sostituzione è un riferimento al primo gruppo di cattura. Sono state sostituite due corrispondenze, quindi $count è 2.

Conclusione

preg_filter esegue una ricerca e sostituzione tramite espressione regolare proprio come preg_replace, ma scarta i soggetti che non corrispondono — restituendo null per le stringhe e omettendo gli elementi non corrispondenti dagli array. Questo la rende la scelta giusta quando il filtraggio e la sostituzione devono avvenire insieme in un unico passaggio.

Per approfondire il toolkit regex di PHP, consulta preg_match per verificare una singola corrispondenza, preg_match_all per trovare tutte le corrispondenze, preg_split per suddividere le stringhe, e preg_replace_callback quando la sostituzione deve essere calcolata tramite codice.

Esercitazione

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