Non l'ho provata ma dovrebbe funzionare:
Codice PHP:
<?php
$test = "ciao box.png";
echo preg_replace('/^((?:.)+)\.(png|jpg|jpeg|gif|bmp)$/', '<img src="\\1.\\2" alt="\\1" />', $test);
?>
/.../ Identifica la definizione del pattern
^ L'inizio della frase
(...) blocco con back reference (che sarà \1) e al cui interno ha
(?:.)+
?: evita di definire una back referense per questo blocco
. qualsiasi carattere
quindi (?:.)+ si legge un qualsiasi carattere ripetuto 1 o più volte
\. identifica il punto (la barra evita di considerare . come carattere jolly)
(png|jpg|jpeg|gif|bmp) Gruppo che identifica l'estensione (con back reference che sarà poi \2)
$ fine frase.