Os padrões para a criação do template seguirão o skema abaixo.
<tpl:pegar_perfil cod="1" color="#FF0000"> <strong>texto</strong><br> textos com e sem formatação HTML </tpl:pegar_perfil>
O interpretador de template irá pegar o pegar_perfil, que é uma função que deve ser criada e passar como parâmetro os atributos e o conteúdo.
Comecei a criar a regex e cheguei em uma.
<tpl:([a-z0-9_]+) ?([^>]+)>(.*)<\/tpl:\1>
Usando o programa Visual REGEX para ver os matches, encontrei um problema. Se você utiliza apenas 1 nome (pegar_perfil) ele funciona legal.
O problema está quando ele aparece mais de uma vez. Ele sempre bate o padrão <\/tpl:\1> com a última ocorrência. As imagens abaixo ilustram melhor.
A parte pink é relativa ao padrão (.*), enquanto a 2ª parte vermelha é relativa ao padrão <\/tpl:\1>

Ocorrência única

Mais de uma ocorrência
Alguém sabe como me ajudar?!?
Outra coisa, como eu migro essa regex para o PHP? Mais especificamente para a função preg_replace_callback.
Desde já, agradeço.