Forse nel tuo caso specifico non hai bisogno delle regexp. Un str_replace basterebbe.

codice:
Senza regexp
<? 
$a = "[immagine1.jpg][immagine2.gif][immagine3.jpg]";
$a = str_replace("[","<img src=\"",$a);
$a = str_replace("]","\">",$a);
print $a;
?>
Con regexp
<? 
$b = "[immagine1.jpg][immagine2.gif][immagine3.jpg]";
$pattern = "|\[([^]]*)\]|";
$c = preg_replace($pattern,"<img src=\"\\1\" alt=\"\\1\">",$b);
print $c;
?>