Henson
Henson

Reputation: 5913

get filename with pure extension

I'm coding a script to get image from a site. All is good, but then I notice there are some sites which have images in format like this:

http://site-name/images/dude-i-m-batman.jpg?1414151413
http://site-name/images/dude-i-m-batman.jpg?w=300

right now I'm dealing with it by doing

$file = substr($media,0, strrpos($image, '.') + 4);

I'm just wondering whether it's a good practice or there's a better way.

I've tried pathinfo and a couple other methods, but all return extension with the query string.

Thanks

Upvotes: 2

Views: 1470

Answers (6)

LSerni
LSerni

Reputation: 57388

Parse the URL with parse_url, retrieve the path part:

 $datum = parse_url($url);

 $parts = pathinfo($datum['path']);

 $ext = $parts['extension'];

You may also use getImageInfo($full_url), if fopen_wrappers allow it, and retrieve image info such as width, height, and most importantly, mime_type.

This because you will find several files without extension or with the wrong one, put there to trick browsers into downloading as image and trusting that the browser will recognize the image format nonetheless (been there, done that :-( )

Upvotes: 8

hakre
hakre

Reputation: 197659

Obviously what you do now has some shortcomings. One of them you already noticed your own:

  • Not all URLs end with the file-extension.
  • Not all file-extensions are of three letters (e.g. .jpeg)

So what you want is to get the path from a URL:

$imagePath = parse_url($imageUrl, PHP_URL_PATH);

And then you want to get the extension from that path:

$imageName = pathinfo($imagePath, PATHINFO_EXTENSION);

And done. You're not the first who needs that, so functions already exist for the job.

Upvotes: 3

Mitya
Mitya

Reputation: 34556

I'm unsure whether you mean you want the extension or (judging from your current code) the full path (minus any query string).

Here's both:

$file = "http://site-name/images/dude-i-m-batman.jpg?1414151413";
preg_match('/^([^\?]+)(?:\?.*)?/', $file, $path_noQS);
preg_match('/(?<=\.)(\w{2,5})(?:\?.*)?/', $file, $extension);
echo $path_noQS[1]; //path, without QS
echo $extension[1]; //extension

Upvotes: 2

biziclop
biziclop

Reputation: 14596

http://codepad.org/KXZwKCjs

$u = 'http://site-name/images/dude-i-m-batman.zip.jpg?1414151413?1234';
$u = explode('?', $u, 2 ); // ignore everything after the first question mark
$ext = end(explode('.',$u[0])); // last 'extension'

Upvotes: 0

Andrey Vorobyev
Andrey Vorobyev

Reputation: 886

may be something like this

$parsedUrl = parse_url('http://site-name/images/dude-i-m-batman.jpg?1414151413');
$parsedFileInfo = pathinfo($parsedUrl['path']);
echo $parsedFileInfo['extension'];              

Upvotes: 0

Max Hudson
Max Hudson

Reputation: 10206

Your solution only works with 3 character extensions. If you know all the extensions will be 3 characters than yours is a perfectly viable solution. Otherwise:

$ext = pathinfo($filename, PATHINFO_EXTENSION);

This should definitely work if you have the correct file name

If for some reason that doesn't work, you can use this:

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);
$exts = split("[/\\.]", $filename);
$n = count($exts)-1;
$ext = $exts[$n];

Upvotes: 0

Related Questions