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_replacerestituisce il soggetto invariato.preg_filterrestituiscenullper 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
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.