Ammettiamo di avere una stringa di questo tipo:
_MATCH_MATCH_
e vogliamo trovare tutti i riferimenti di "MATCH" che siano circondati da "_". Vogliamo sostituire tutti questi riferimenti con "*".
preg_replace('/_MATCH_/', '*', $text); # Risposta: "*MATCH_"
Questo sistema non funziona, sia perchè sostituisce solo il primo "MATCH", sia perchè la sostituzione elimina anche i "_" (e non è quello che vogliamo fare).
La soluzione è questa:
preg_replace('/(?<=_)MATCH(?=_)/', '*', $text) # Risposta: "_*_*_"
Questa soluzione fa uso di due costrutti delle PERL REGEXP chiamati positive look-ahead "(?=" e positive look-behind "(?<=", che in pratica permettono di fare "ricerche all'indietro" e "ricerche in avanti" senza influenzare il match effettivo.
Una documentazione esauriente può essere trovata qui:
Aggiungi un commento