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

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

Commenti

Non ci sono ancora commenti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I commenti vengono pubblicati dopo la moderazione.