Non puo' non funzionare, avrai sbagliato qualcosa nel integrare il codice. Posta qui la porzione interessata, e l'eventuale errore che ricevi.

Per quanto riguarda la spiegazione, e' semplice:

Per non fare confusione con l'escape del \/ possiamo scrivere l'espressione anche cosi':

$testo = preg_replace('#:/(?=[^/])#','[img]/img/emoticon/03.gif[/img]',$testo);

## sono i delimitatori
:/ e' il simbolo cercato
(?= ) e' un asserzione positiva che guarda avanti (cioe' da cos'e' seguito il carattere cercato) - non includera' nella ricerca il carattere successivo
[] definisce una classe di caratteri, e ^ all'interno e' una negazione
Quindi il tutto insieme significa: trova qualsiasi :/ che non sia seguito da una /, e sostuiscilo con [img]/img/emoticon/03.gif[/img]

Si poteva fare anche il contrario, cioe' '#:/(?=\s)#' che significa qualsiasi :/ seguito da uno spazio - sta a te scegliere, in base a come vuoi che funzioni nella tua applicazione.

Ps: ti conviene studiare le espressioni regolari, altrimenti avrai molte difficolta a creare un applicazione completa