@codenerd på twitter Mit seneste tweet:

Hent filendelse i PHP med funktionen pathinfo()

Når man skal bruge filendelsen for en fil, findes der mange gode og brugbare metoder – men hvorfor ikke bare bruge PHPs egen funktion?

I dag da jeg sad og surfede en gammel nyhedsgruppe faldt jeg over følgende funktion fra about.com:

PHP
1
2
3
4
5
6
7
8
9
10
<?php
function findexts ($filename)
{
$filename = strtolower($filename) ;
$exts = split("[/\.]", $filename) ;
$n = count($exts)-1;
$exts = $exts[$n];
return $exts;
}
?>

Denne funktion var rent faktisk blevet anbefalet af flere, hvilket undrede mig – det er omtrent den største omvej, til at få fat på filendelsen, jeg nogen siden har set. Af ren nysgerrighed måtte jeg så se hvad folk ellers anbefalede rundt omkring, og her er et par af de metoder der synes at være populære:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$fil = 'minfil.txt';
//unødig omdannelse til array og flytning af internal pointer
$endelse = end(explode('.', $fil));
echo $endelse.'<br>';
//overkill - preg_replace er ikke til så simple opgaver!
$endelse = preg_replace('/^.*.([^.]+)$/D', '$1', $fil);
echo $endelse.'<br>';
//mest fornuftige alternativ
$endelse = substr(strrchr($fil, '.'), 1);
echo $endelse.'<br>';
//heller ikke så ringe
$endelse = substr($fil, strrpos($fil, '.') + 1);
echo $endelse.'<br>';
?>

php:strrchr metoden ser rent faktisk ganske fornuftig ud, men specielt php:preg_replace metoden virker som totalt overkill, og spild af kræfter for PHP.

pathinfo – den rette løsning

PHP har utroligt mange funktioner indbygget, og det er da også tilfælde når vi vil ha fat i filendelsen. php:pathinfo returnerer information om en fil som et array, herunder sti, filnavn og filendelse. Hvis vi angiver at vi ønsker filendelsen, får vi denne direkte som en streng uden at skulle tilgå et array efterfølgende:

PHP
1
2
3
4
5
6
7
8
9
<?php
//pathinfo fuld info i array
$fil_info = pathinfo($fil);
print_r($fil_info);
//pathinfo - kun filendelse
$endelse = pathinfo($fil, PATHINFO_EXTENSION);
echo $endelse.'<br>';
?>

I mit daglige arbejde, ser jeg ofte funktioner, der er lavet til at gøre præcis det samme, som en indbygget funktion i PHP, men denne filendelse funktion fra about.com, er noget af det værste jeg længe har set – langsom, klodset og unødvendig. Brug altid PHPs egne funktioner hvis de findes!

NB: Husk nu at bare fordi en fil ender på fx .txt, så betyder det ikke at det er en tekst fil – brug aldrig pathinfo til validering af filtype!

1 kommentar

  1. Skrevet af Morten  d. 22/05/2009 kl 11:06

    Det er jo et typisk eksempel på at finde en metode til at løse et problem – der godt nok ikke er den nemmeste/pæneste – men som virker. Og det er faktisk en af grundene til jeg mener, at webudvikling også kan være kreativt (på linje med webdesign osv).

    Mon ikke de fleste har prøvet at finde en løgning på et problem – for efterfølgende at finde ud af, at det kunne have været læst meget nemmere.

    Svar på kommentaren

Leave a Reply to Morten Cancel reply

Krævede felter er markeret med *.

*