innanziutto devi usare preg_replace_callback per usare funzioni/metodi come replacement. Sintassi per richamare un metodo di una classe:
Codice PHP:
preg_replace_callback($rex,array(&$this'cb_function'),$string) ; 
Poi io proverei a fare una cosa di questo tipo:

Codice PHP:
function rpl_callback($mth) {
$tmp '' ;
switch(
$mth[1]){
  case 
'FORM'$tmp=$this->blabla(); break;
  case 
'RICERCA'$tmp=$this->blabla();break;
  case 
'ELENCO'$tmp=$this->blabla();break;
  }
return 
$tmp ;
}


$rex '#(<% CATEGORIE_(FORM|RICERCA|ELENCO) %>)#' ;
$str=preg_replace_callback($rex, array(&this,'rpl_callback'), $str) ; 
approssimativamente.

EDIT:
mi sono scordato, ovviamente potresti usare preg_replace attivando nella regex il modificatore "e", lasciando più o meno invariato il codice che hai postato, ma secondo me è più scomodo.