Rób to szybciej.
Połączenia na niskim poziomie muszą być bardzo szybkie, więc pomyślałem, że warto było to zbadać. Wypróbowałem kilka metod (z różnymi długościami ciągów, długościami przedłużeń, wieloma biegami), oto kilka rozsądnych:
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);}
Wyniki
nie były bardzo zaskakujące. Słaba pathinfo
jest (zdecydowanie!) Najwolniejsza (wygląda na to, że próbuje przeanalizować całość, a następnie upuścić wszystkie niepotrzebne części) - a method3()
(strrpos) jest zdecydowanie najszybsza:
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
UWAGA: pierwsza metoda ma efekt uboczny: zwraca całą nazwę, gdy nie ma rozszerzenia. Z pewnością nie ma sensu mierzyć go dodatkowymi strpos, aby uniknąć takiego zachowania.
Wniosek
Wygląda to jak Droga Samuraja:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}