Regexp multiple che si elidono a vicenda (positive look-ahead e look-behind)

Tags: 

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:

http://www.perlmonks.org/?node_id=518444

Aggiungi un commento