Pues ese ejemplo que me diste funciona perfectamente...
Sin embargo... simplifiqué la expresión a esto: `\[url=(.*)?\](.*?)\[/url\]`is
Por cierto... ¿qué significa el símbolo ` (acento invertido)?
¿Por qué en el segundo agrupamiento colocas el "?" dentro del subpatrón?
Adicionalmente, la etiqueta de las imágenes la hice con regexp también, asi:
Código PHP:
$result=preg_replace("`\[img](.*)?\[/img\]`is","<img src=\"photos/$1\" />",$result);