Aggiungi un lookahead negativo!
In questo modo dovrebbe funzionare

Codice PHP:
   $pattern "/\[span=([a-z0-9-]+)\]([^\[\]]+)(?!\[\/span\])\[\/span\]/"
Occhio che non si vedono i caratteri backslashati..
In realta' e' cosi

$pattern = "/\[span=([a-z0-9-]+)\]([^\[\]]+)(?!\[\/span\])\[\/span\]/";

Ciao

----

Oooops ho preso un abbaglio.. in realta' non funziona sorry :P