Ha pasado mucho tiempo, igual ya lo solucionaste... pero hoy me he levantado y se me encendió la bombilla.
Prueba con esto:
Código PHP:
$patron = '/\[QUOTE=([a-zA-Z0-9_]*)\]([^\[\]]+)\[\/QUOTE\]/';
$replace = "<div class=\"cita\">Cita de \\1
<div style=\"border:1px solid\">\\2</div>
</div>";
while( preg_match( $patron, $texto ) )
{
$texto = preg_replace( $patron, $replace, $texto);
}
Consiste en que el patrón no permita los caracteres [ y ] entre las etiquetas [QUOTE] y [\QUOTE].
Luego en el bucle se van reemplazando de dentro hacia fuera.