PHP, get file name without file extension

PhpFileString

Php Problem Overview


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.

Php Solutions


Solution 1 - Php

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

Example 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

Solution 2 - Php

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.

Solution 3 - Php

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

pathinfo($path, PATHINFO_FILENAME);

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

Solution 4 - Php

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.

Solution 5 - Php

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

Solution 6 - Php

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

Solution 7 - Php

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.

Solution 8 - Php

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

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

Solution 9 - Php

@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"

Solution 10 - Php

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.

Solution 11 - Php

You can write this

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

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

Solution 12 - Php

Short

echo pathinfo(__FILE__)['filename']; // since php 5.2

Solution 13 - Php

The existing solutions fail when there are multiple parts to an extension. The function below works for multiple parts, a full path or just a a filename:

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

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file

Solution 14 - Php

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

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

Solution 15 - Php

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"

Solution 16 - Php

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");
?>

Solution 17 - Php

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"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMostafa ElkadyView Question on Stackoverflow
Solution 1 - PhpanonView Answer on Stackoverflow
Solution 2 - PhpGordonView Answer on Stackoverflow
Solution 3 - PhpyckartView Answer on Stackoverflow
Solution 4 - Phpcaiosm1005View Answer on Stackoverflow
Solution 5 - PhpanydasaView Answer on Stackoverflow
Solution 6 - PhpFaruque Ahamed MollickView Answer on Stackoverflow
Solution 7 - PhpRohan KhudeView Answer on Stackoverflow
Solution 8 - PhpfireView Answer on Stackoverflow
Solution 9 - PhpNSINEView Answer on Stackoverflow
Solution 10 - PhpHoàng Vũ TgttView Answer on Stackoverflow
Solution 11 - PhpJitendra PawarView Answer on Stackoverflow
Solution 12 - PhpmariovialsView Answer on Stackoverflow
Solution 13 - PhpDan BrayView Answer on Stackoverflow
Solution 14 - Phpuser2047861View Answer on Stackoverflow
Solution 15 - PhpGhanshyam GohelView Answer on Stackoverflow
Solution 16 - Phpshaz3eView Answer on Stackoverflow
Solution 17 - PhpVincenzo RuffaView Answer on Stackoverflow