Daha hızlı yap.
Düşük seviyeli çağrıların çok hızlı olması gerekiyor, bu yüzden biraz araştırmaya değer olduğunu düşündüm. Birkaç yöntem denedim (çeşitli dize uzunlukları, uzatma uzunlukları, her biri birden çok çalışır), burada bazı makul olanlar:
function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}
Sonuçlar
çok şaşırtıcı değildi. Zavallı (açık farkla pathinfo
!) En yavaş (her şeyi ayrıştırmaya ve sonra tüm gereksiz parçaları düşürmeye çalışıyor gibi görünüyor) - ve method3()
(strrpos) en hızlısıdır:
Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:
Method 1: 312.6 mike (response: txt) // preg_replace
Method 2: 472.9 mike (response: txt) // preg_match
Method 3: 167.8 mike (response: txt) // strrpos
Method 4: 340.3 mike (response: txt) // explode
Method 5: 2311.1 mike (response: txt) // pathinfo <--------- poor fella
NOT: ilk yöntemin bir yan etkisi vardır: uzantı olmadığında tüm adı döndürür. Elbette bu davranışı önlemek için ek bir strpos ile ölçmek mantıklı olmaz.
Sonuç
Samurayın Yolu gibi görünüyor:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}