Tal y como lo mencionaron, con expresiones regulares puedes hacerlo:
Código PHP:
Ver original$texto = 'Este es un [b]texto[/b] de [i]ejemplo[/i].';
$patron = '/\[([^\[\]]*)\]*/s';
Resultado: Este es un
texto de
ejemplo.
Solo tienes que capturar a todos los bloques cuyo formato sea "[contenido diferente a
[]]" y encerrar el contenido entre paréntesis, creando así un grupo anónimo que luego se coloca entre los delimitadores de etiquetas HTML "<>".
DEMO
La expresión regular que utilicé es bastante simple, pero sirve para ejemplificar la explicación. Busca una más completa para casos de etiquetas de autocierre y otros casos especiales.
Un saludo