Cita: de hecho, me parece que falta un return dentro de la cadena a evaluar... a menos, que la función imprima y no devuelva algún resultado...
El return deberia estar dentro de la funcion. De hecho no es ni como lo tenia yo. Tu forma es mucho mas eficaz pero solo habria que quitar el return.
Código PHP:
$texto = preg_replace('/\[-(.*)-\]/eU', 'function_exists("\\1")? \\1() : "\\1";', $texto);
En cuanto a la expresion regular
'/\[-(.*)-\]/eU' hay que añadir al final el modificador U también para evitar que la regex sea ambiciosa.
Si no usas el modificador U la expresion regular haria lo siguiente:
este e s mi texto [-nombrefun_2-] este este e s mi texto [-nombrefun_2-] este e s
Cogeria todo lo que hay entre medio hasta que se encuentre con la última secuencia de caracteres ( -] ) que coincidan con la expresion.
Si añadimos el modificador U. La expresion no se vuelve ambiciosa. Y coge todos los caracteres hasta que se encuentre con la
primera aparicion de secuencia de caracteres (-]). Ejemplo:
este e s mi texto [-nombrefun_2-] este este e s mi texto [-nombrefun_2-] este e s