Preg_replace_callbackkel egyszerű, tisztán Regexppel szerintem ez nem fog menni (éjfél van, régen volt a formális nyelvek, de gyanús, hogy ehhez más push-down automaton kéne)
echo preg_replace_callback('/(?<=%%)(.*?)(?=!%)/', function($x) {
return str_replace('@',':', $x[1]);
}, 'zj@fcavaszt%%rfcazr@tcc@cccc!%ccbfw@fcujw%%efcubzj@agew@ujca!%gewfcc@ccccaw');
BlackY