Muchas gracias por la respuesta, ya creo que lo entiendo, te lo expongo aquí y tu me dices si estoy equivocado en algo:
preg_replace, ejecuta tanto en el "pattern" como en el "replacement" como un patrón unido, quiero decir que la /e de eval puesta en el pattern, se puede usar para lo que meta en el "replacement", en este caso $matches[$1].
Ahora bien, pongo los paréntesis en el "pattern" para sacar una segunda coincidencia y esta segunda coincidencia, sera un subpatrón, con los números que usare en $matches con el referenciador \\1 o $1.
Es decir, en el preg_replace, tengo dos cosas, un array con las coincidencias {1},{2} y {3} y otro array con los números 1,2,3 que son los que usare en $matches.
No se si me he explicado bien, espero haberlo hecho lo mejor posible.
Un saludo y gracias por todo.