Merhaba. regex fonksiyonları bu basit işlem için fazla yorucudur. C stdlib ile gelen fonksiyonlar diğerlerine göre çok daha hızlı çalışırlar.
Şöyle basit bir fonksiyon ile almanız daha doğrudur.

function uzanti($dosya)
{
if (false !== $pos = strrpos($dosya, ".")) {
return substr($dosya, $pos + 1);
}
return null;
}


Alternatif olarak aşağıdaki fonksiyonu da kullanabilirsiniz. Yukarıdaki fonksiyon aşağıdakinden %95 oranında daha hızlı çalışır (8 çekirdekli ryzen cpu ile test edilmiştir).

function uzanti2($dosya)
{
$arr = explode(".", $dosya);
if (count($arr) < 2) {
return null;
}
return end($arr);
}


Yukarıdaki her iki fonksiyon da uzantısı olmayan dosyalar için null döndürür. Son karakteri "." olan dosyalar için ise boş string döndürür. Bu yüzden dönen değerler aşağıdaki gibi kontrol edilmelidir:

$ext = uzanti("dosya.jpg.exe");
if ($ext == "") {
exit("uzantisiz dosya girilmis.");
}