Menu

PHP preg_replace(): sostituzioni regex con backreference

preg_replace($pattern, $replacement, $subject) sostituisce ogni corrispondenza di un'espressione regolare: preg_replace('/\s+/', ' ', $text) riduce gli spazi multipli. Impara i backreference come $1, preg_replace_callback, la rimozione dei caratteri non alfanumerici, limiti e conteggi.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

preg_replace($pattern, $replacement, $subject) trova ogni corrispondenza di un'espressione regolare in una stringa e la sostituisce. preg_replace('/\s+/', ' ', $text) trasforma ogni sequenza di spazi, tabulazioni e a capo in un singolo spazio.

La stringa originale non viene modificata; preg_replace() ne restituisce una nuova. \b indica un confine di parola, ed è per questo che cats resta invariato.

Backreference: 1,1, {1} e \1

Nella sostituzione, $1 sta per ciò a cui ha corrisposto il primo gruppo di cattura, $2 per il secondo e $0 per l'intera corrispondenza. Usali per riordinare il testo trovato.

Scrivi la sostituzione tra apici singoli. Tra virgolette doppie "\1" diventa un escape ottale (il byte 0x01) e "${1}" viene letto come una variabile chiamata 1, che non è definita e usa una sintassi delle stringhe deprecata da PHP 8.2. '\1' tra apici singoli funziona come '$1', ma $1 è la grafia più comune.

Rimuovere i caratteri non alfanumerici

Una classe di caratteri negata, [^...], corrisponde a tutto ciò che non è elencato. Sostituirla con '' la rimuove. Per il testo in altre lingue, usa le classi Unicode \p{L} (qualsiasi lettera) e \p{N} (qualsiasi cifra) con il modificatore u, altrimenti eliminerai é, ü e ogni carattere giapponese.

Creare uno slug per un URL

Più schemi in sequenza trasformano un titolo in uno slug per un URL. Prima converti in minuscolo, poi sostituisci ogni sequenza di caratteri non alfanumerici con un solo trattino, infine togli i trattini alle estremità:

Più schemi, un limite e un conteggio

$pattern e $replacement possono essere array: ogni schema viene sostituito dalla sostituzione con lo stesso indice, in ordine. Il quarto argomento limita le sostituzioni per schema (-1 significa nessun limite), e il quinto riceve quante sostituzioni sono state fatte.

Calcolare la sostituzione con preg_replace_callback

Quando la sostituzione dipende dalla corrispondenza, usa preg_replace_callback(). Chiama la tua funzione una volta per corrispondenza con l'array $matches e inserisce ciò che la funzione restituisce. Una arrow function tiene le callback brevi su una riga.

preg_replace_callback_array() accetta un array di coppie pattern => callback quando più schemi richiedono ciascuno la propria funzione.

Testo di sostituzione da una variabile

Un $ o una barra rovesciata nella sostituzione hanno un significato, quindi una sostituzione che arriva da un utente o da un database può risultare alterata. Un prezzo di $10 viene letto come un riferimento al gruppo 10, che non esiste, e viene fuori vuoto:

Quando né il testo cercato né la sostituzione sono schemi, str_replace() è la scelta più semplice e più veloce. Per verificare uno schema prima di sostituire qualcosa, vedi preg_match().

Domande frequenti

Come uso i backreference in preg_replace?

Richiama i gruppi di cattura come $1, $2 (o \1) nella sostituzione: preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') restituisce "14/03/2026". Scrivi la sostituzione tra apici singoli, e usa ${1} quando dopo il riferimento segue una cifra.

Come rimuovo tutti i caratteri non alfanumerici in PHP?

preg_replace('/[^a-zA-Z0-9]/', '', $s) tiene solo lettere e cifre ASCII. Per tenere le lettere di ogni lingua (é, ü, 日本語), usa le classi Unicode con il modificatore u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).

Qual è la differenza tra preg_replace e preg_replace_callback?

preg_replace() accetta una stringa di sostituzione fissa con i segnaposto $1. preg_replace_callback() chiama una funzione per ogni corrispondenza e usa il suo valore restituito, quindi puoi calcolare la sostituzione: metterla in maiuscolo, farci dei calcoli o cercarla in un array.

Meglio str_replace o preg_replace?

Usa str_replace() quando sostituisci un testo fisso: è più veloce e non richiede escape. Usa preg_replace() quando il testo da sostituire segue uno schema, come una qualsiasi sequenza di spazi, una qualsiasi cifra o un confine di parola.

Come sostituisco solo la prima corrispondenza con preg_replace?

Passa un limite come quarto argomento: preg_replace('/\d+/', '#', 'a1 b2 c3', 1) restituisce "a# b2 c3". Il quinto argomento, passato per riferimento, riceve il numero di sostituzioni effettuate.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA