253

I have this PHP code:

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

If I have a file named my.zip, this function returns .zip.

I want to do the reverse, I want the function to return my without the extension.

The file is just a string in a variable.

Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335
Mostafa Elkady
  • 5,645
  • 10
  • 45
  • 69

18 Answers18

492

No need for all that. Check out pathinfo(), it gives you all the components of your path.

$filename = pathinfo($filepath, PATHINFO_FILENAME);

will give you the filename without extension.

Some other examples from the manual:

$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0

Output of the code:

/www/htdocs
index.html
html
index

And alternatively you can get only certain parts like:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html
Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
222

As an alternative to pathinfo(), you can use

  • basename() — Returns filename component of path

Example from PHP manual

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

You have to know the extension to remove it in advance though.

However, since your question suggests you have the need for getting the extension and the basename, I'd vote Pekka's answer as the most useful one, because it will give you any info you'd want about the path and file with one single native function.

Community
  • 1
  • 1
Gordon
  • 312,688
  • 75
  • 539
  • 559
  • 1
    what if i do not know about file extension .. let say if path is dynamic anytype of file extension can come in it !! then what ?? – user889030 Dec 13 '16 at 06:10
  • @user889030 then you have a different scenario than the OP and don't use `basename`, but `pathinfo` as shown elsewere on the page. – Gordon Dec 13 '16 at 06:51
127

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

Simple functional test: https://ideone.com/POhIDC

yckart
  • 32,460
  • 9
  • 122
  • 129
19

Another approach is by using regular expressions.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

This removes from the last period . up until the end of the string.

caiosm1005
  • 1,686
  • 1
  • 19
  • 31
  • I like this answer, very simple and works when you don't know the extension. – relipse May 20 '14 at 15:08
  • Much better than using explode, and only catches the last period section in case you used periods in file names – Kiwizoom Feb 03 '15 at 23:32
  • 8
    **No**, it's much much worse. Stop regexing people. – Pacerier Mar 05 '15 at 16:00
  • Thanks, and the above comments nailed it. Not having to know the extension makes this more useful. – James Taylor Jun 18 '15 at 14:39
  • @Pacerier Could you give any reason as to why it's much worse? – caiosm1005 Nov 29 '15 at 13:15
  • 1
    @caiosm1005, The attack surface immediately increases because It's hard to reason against the internals of a regex engine. For example, in the code above, it wouldn't be odd if there's some input `$fileName` which could cause the engine to run in exponential (or worse) time. And assuming we have finished dissecting the internals of this specific regex engine and have theoretically proven it to be robust against every possible value `$fileName` could be, the code is still not arbitrarily portable to another platform that has another implementation of the regex engine. – Pacerier Dec 01 '15 at 22:03
  • 1
    @Pacerier I have to disagree. Firstly, this is a very simple regex; I just can't see how the processing time could increase exponentially. Secondly, there are no special wildcards in this expression, so it should be able to run the same in any regex implementation. – caiosm1005 Sep 23 '16 at 02:24
15

If the extension is not known, use this solution

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

PHP MAN function pathinfo

yckart
  • 32,460
  • 9
  • 122
  • 129
anydasa
  • 2,616
  • 1
  • 15
  • 13
  • Please provide a like to the php man page for `pathinfo`. This is going to help OP make the `ShowFileExtension` method better and will provide extra reading for anyone trying to find this answer. Also a bit of a description would not go astray... – Michael Coxon Jun 04 '15 at 14:59
  • 1
    I have answered this question already with the same solution, ~2 years before yours ;) – yckart Jul 24 '17 at 21:45
  • @yckart true but this does give multiple examples within the answer. Yours has the benefit of linking to ideone.com but the site could go offline. – Adam Elsodaney Feb 24 '18 at 15:39
10

There is no need to write lots of code. Even it can be done just by one line of code. See here

Below is the one line code that returns the filename only and removes extension name:

<?php
 echo pathinfo('logo.png')['filename'];
?>

It will print

logo

Source: Remove extension and return only file name in PHP

  • This was already mentioned in the accepted answer. This answer adds nothing new to the page at the time that it was posted. – mickmackusa Jun 07 '21 at 06:18
8

Almost all the above solution have the shown getting filename from variable $path

Below snippet will get the current executed file name without extension

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

Explanation

$_SERVER['SCRIPT_NAME'] contains the path of the current script.

Rohan Khude
  • 4,455
  • 5
  • 49
  • 47
7

@Gordon basename will work fine if you know the extension, if you dont you can use explode:

$filename = end(explode(".", $file));
fire
  • 21,383
  • 17
  • 79
  • 114
  • 1
    Please direct comments to me with the comment function below my answer. The most appropriate function for this is `pathinfo`, which is why I gave `basename` as an alternative only. There is no need to reinvent `pathinfo` with regex or `explode`. – Gordon Feb 02 '10 at 11:30
  • 6
    @fire, Your update makes no sense. `end(explode(".", $file));` gives you the extension, not the filename. – Pacerier Mar 05 '15 at 16:01
4

@fire incase the filename uses dots, you could get the wrong output. I would use @Gordon method but get the extension too, so the basename function works with all extensions, like this:

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"
NSINE
  • 49
  • 1
4

in my case, i use below. I don't care what is its extention. :D i think it will help you

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.
AlbinoDrought
  • 986
  • 17
  • 24
Hoàng Vũ Tgtt
  • 1,863
  • 24
  • 8
2

You can write this

$filename = current(explode(".", $file));

These will return current element of array, if not used before.

Jitendra Pawar
  • 1,285
  • 15
  • 27
  • Hello, Pleas e check before downgrading it. It is working I had used it in my code many a times. By using this function you can get just a file name If you file name is "xyz.jpg". It may not work with file names containing entire path in it. – Jitendra Pawar Mar 22 '16 at 13:07
  • This also doesn't work correctly if a filename has multiple dots in it, e.g. "some.interesting.image.jpg" – ganzpopp Nov 04 '19 at 12:17
2

Short

echo pathinfo(__FILE__)['filename']; // since php 5.2
mariovials
  • 782
  • 9
  • 12
2

Sometimes an extension contains more than one part. It may or may not be desirable to remove the entire extension. The function below removes the entire extension if you pass true as the second parameter:

function removeExt($path, $fullExt = false)
{
    if ($fullExt === false)
         return pathinfo($path, PATHINFO_FILENAME);
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

Eg:

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file.tar
echo removeExt('https://example.com/file.tar.gz', true);
// https://example.com/file
echo removeExt('file.tar.gz');
// file.tar
echo removeExt('file.tar.gz', true);
// file
echo removeExt('file');
// file
Dan Bray
  • 7,242
  • 3
  • 52
  • 70
1

File name without file extension when you don't know that extension:

$basename = substr($filename, 0, strrpos($filename, "."));

user2047861
  • 115
  • 1
  • 10
1

If you don't know which extension you have, then you can try this:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Working with all possibilities:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"
Ghanshyam Gohel
  • 1,264
  • 1
  • 17
  • 27
1

Your answer is below the perfect solution to hide to file extension in php.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>
shaz3e
  • 316
  • 2
  • 14
0

This return only filename without any extension in 1 row:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
0

File extension extract from file:

File Name = subrotobiswas.jpg
$fileExtension = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_EXTENSION); //Output: jpg
$newNameOfFileWithoutExtension = basename( $_FILES["fileToUpload"]["name"], $fileExtension ); //Output: subrotobiswas
$fullFileName = $newNameOfFileWithoutExtension . "." .$fileExtension; // Output: subrotobiswas.jpg
Subroto Biswas
  • 553
  • 7
  • 5