Làm cho nó nhanh hơn.
Các cuộc gọi cấp thấp cần phải rất nhanh vì vậy tôi nghĩ rằng nó đáng để nghiên cứu. Tôi đã thử một vài phương thức (với độ dài chuỗi khác nhau, độ dài mở rộng, nhiều lần chạy mỗi cái), đây là một số phương pháp hợp lý:
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);}
Kết quả
không mấy ngạc nhiên. Tội nghiệp pathinfo
là (cho đến nay!) Là chậm nhất (có vẻ như anh ta đang cố phân tích toàn bộ và sau đó bỏ tất cả các phần không cần thiết) - và method3()
(strrpose) là nhanh nhất, cho đến nay:
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
LƯU Ý: phương thức đầu tiên có tác dụng phụ: nó trả về toàn bộ tên khi không có phần mở rộng. Chắc chắn sẽ không có ý nghĩa gì khi đo nó bằng một âm mưu bổ sung để tránh hành vi này.
Phần kết luận
Điều này trông giống như cách của Samurai:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}