Io dico che prima di tutto dovresti scrivere una routine per il parsing del template

Bè la RegEx per quello che vorresti tu è:
Codice PHP:
#\{loop.*=(.*?)\}(.*?)\{/loop\}# 
In $1 = hai il parametro del loop
In $2 = hai il testo all'interno del loop

Dopodichè scrivi una routine per la sostituzione e qua và bene la str_replace, ma se vuoi un pò di performance ti consiglio le espressioni regolari ancora una volta, visto che la libreria che gestisce le epsressioni regolari di PHP (le PCRE) è molto efficace

la RegEx generica per riconoscere un testo delimitato dalle parentesi graffe è:
Codice PHP:
#\{(.*?)\}# 
Adesso scrivi un pò di codice e se ti blocchi ancora una volta, chiedi qua ancora.