इसे जल्दी करो।
निम्न स्तर की कॉल बहुत तेज़ होने की आवश्यकता है इसलिए मुझे लगा कि यह कुछ शोध के लायक है। मैंने कुछ तरीकों की कोशिश की (विभिन्न स्ट्रिंग लंबाई के साथ, विस्तार की लंबाई, प्रत्येक में कई रन), यहां कुछ उचित हैं:
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);}
परिणाम
बहुत आश्चर्यजनक नहीं थे। गरीब pathinfo
(अब तक!) सबसे धीमा (ऐसा लगता है कि वह पूरी चीज़ को पार्स करने की कोशिश कर रहा है और फिर सभी अनावश्यक भागों को छोड़ देता है) - और method3()
(स्ट्रैप) सबसे तेज़ है, अब तक:
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
नोट: पहली विधि का एक साइड इफेक्ट है: जब कोई विस्तार नहीं होता है तो यह पूरा नाम वापस कर देता है। निश्चित रूप से इस व्यवहार से बचने के लिए एक अतिरिक्त स्ट्रैप के साथ इसे मापने का कोई मतलब नहीं होगा।
निष्कर्ष
यह समुराई के रास्ते की तरह दिखता है:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}