PHP – What is the fastest way to find an extension in a url?

I personally tested a few routines to find out if the extension in a url is one of the searched and after some experiments, I came to the conclusion that the fastest method is not to use preg_match and by no means the function explodes!
In fact, the fastest search was using two php functions: strstr , strrchr and strpos .

I tested a simple url and more complex url to see if the results are valid for a more complicated query. I also tested the case if the extension is not in the ones you are looking for.

Test 1 had the following URLs

  • – /test/get.test.css
  • – /test/get.test.css?param1=test1&param2=test2.js&param3=test3?4

Test 2 had the following URLs

  • – /test/get.test.csss
  • – /test/get.test.csss?param1=test1&param2=test2.js&param3=test3?4

The results for 10 million iterations for each method were as follows:

Test 1:

a) simple url, valid extension

1: Time1: 1.9181 Sec
1: Time2: 2.6230 Sec
1: Time3: 1.8428 Sec

b) complex url, valid extension

1: Time1: 2.7627 Sec
1: Time2: 3.0548 Sec
1: Time3: 1.7855 Sec

Test 2:

a) simple url, invalid extension

: Time1: 1.7706 Sec
: Time2: 2.7265 Sec
: Time3: 1.9815 Sec

b) complex url, ivalid extension

: Time1: 2.1901 Sec
: Time2: 3.0742 Sec
: Time3: 1.8526 Sec

Where:

  • – Time1: preg_match
  • – Time2: explode + strpos
  • – Time3: strstr & strrchr + strpos

The test shows that using the explode function is not the best solution, it is even much slower than the other two solutions.

Using preg_match or strstr + strrchr is the best option, either is good, although preg_match is 15% slower on average

Below is the php code used for testing:

function byrev_SearchExtInUrl($url, $extensions) {     global $mm;          
       $found = strstr($url, '?', true);                 
       if ($found === false) 
              $found = &$url;
       $found = strrchr($found, '.');              
       if ($found !== false) {                                          
              return (strpos($extensions, $found) !== FALSE);                          
       }                    
       return false;
}

function byrev_SearchExtInUrl2($url, $extensions) {                  
       return (boolean)(preg_match($extensions, $url, $match));                            
}

function byrev_SearchExtInUrl3($url, $extensions) {              
       $s = explode('?', $url);
       $s = explode('.', $s[0]);
       $cs = count($s);
       if ($cs>1) {                     
              return (strpos($extensions,$s[$cs-1]) !== FALSE);                                                                                        
       }                 
       return false;
}

$url = $_SERVER['REQUEST_URI'];
$ltest = 10000000;

//~~~~ preg_match
$startTime = microtime(true);      
$extensions = "/.*\.(?:php|txt|xml|js|css|htm|html)(?:\?\S+)?$/i";
for($i=0; $i<$ltest; $i++ ) {
       $Qfound = byrev_SearchExtInUrl2($url, $extensions);
}       
$time1 = $Qfound.": Time1:  " . number_format(( microtime(true) - $startTime), 4) . "  Sec\n";

//~~~~ explode
$startTime = microtime(true);
$Qfound=false;
$extensions = 'php|txt|xml|js|css|htm|html';       
for($i=0; $i<$ltest; $i++ ) {
       $Qfound = byrev_SearchExtInUrl3($url, $extensions);  
}       
$time2 = $Qfound.": Time2:  " . number_format(( microtime(true) - $startTime), 4) . "  Sec\n";

//~~~~ strstr & strrchr
$startTime = microtime(true);
$Qfound = false;
$extensions = '.php|.txt|.xml|.js|.css|.htm|.html';
for($i=0; $i<$ltest; $i++ ) {
       $Qfound = byrev_SearchExtInUrl($url, $extensions);
}       
$time3 = $Qfound.": Time3:  " . number_format(( microtime(true) - $startTime), 4) . "  Sec\n";

echo $time1.$time2.$time3;

 

byrev Written by:

Be First to Comment

    Leave a Reply

    Your email address will not be published. Required fields are marked *