|
basename
Returns filename component of path
(PHP 4, PHP 5)
Example 619. basename() example<?php Related Examples ( Source code ) » basename Examples ( Source code ) » Total number of fields in a table Examples ( Source code ) » File base name Examples ( Source code ) » pathinfo Examples ( Source code ) » Flash video example using very simple .flv Examples ( Source code ) » Png2swf Adding a png Image to a movie using ming Examples ( Source code ) » Jpg2swf Adding a jpg image to a movie using ming Examples ( Source code ) » Javascript alert from swf Examples ( Source code ) » Drawing curve in SWF whith PHP Examples ( Source code ) » Create a swf slideshow Examples ( Source code ) » FeedAggregator using HttpRequest Code Examples / Notes » basenamerichard
you can also make use of the basename() function's second parameter: <?PHP $fpath = "/blah/file.name.has.lots.of.dots.ext"; $fext = array_pop(explode('.', $fpath)); $fname = basename($fpath, '.'.$fext); print "fpath: $fpath\n "; print "fext: $fext\n "; print "fname: $fname\n "; ?> support
works on windows and linux, faster/easier than amitabh's... <?php $basename = preg_replace( '/^.+[\\\\\\/]/', '', $filename ); // Optional; change any non letter, hyphen, or period to an underscore. $sterile_filename = preg_replace( "/[^\w\.-]+/", "_", $basename ); ?> antrik
When using basename() on a path to a directory ('/bar/foo/'), the last path component ('foo') is returned, instead of the empty string one would expect. (Both PHP 4.1.2 and 4.3.8 on GNU/Linux.) No idea whether this is considered a bug or a feature -- I found it extremely annoying. Had to work around using: <?php $file=substr($path, -1)=='/'?'':basename($path) ?> Watch out!
maksymus007
TO stephane dot fidanza at gmail dot com i don't think file with name you given can exists... pvollma
There is a real problem when using this function on *nix servers, since it does not handle Windows paths (using the \ as a separator). Why would this be an issue on *nix servers? What if you need to handle file uploads from MS IE? In fact, the manual section "Handling file uploads" uses basename() in an example, but this will NOT extract the file name from a Windows path such as C:\My Documents\My Name\filename.ext. After much frustrated coding, here is how I handled it (might not be the best, but it works): <?php $filen = stripslashes($_FILES['userfile']['name']); $newfile = basename($filen); if (strpos($newfile,'\\') !== false) { $tmp = preg_split("[\\\]",$newfile); $newfile = $tmp[count($tmp) - 1]; } ?> $newfile will now contain only the file name and extension, even if the POSTed file name included a full Windows path. amitabh
The previous example posted by "pvollma" didn't work out for me, so I modified it slightly: <?php function GetFileName($file_name) { $newfile = basename($file_name); if (strpos($newfile,'\\') !== false) { $tmp = preg_split("[\\\]",$newfile); $newfile = $tmp[count($tmp) - 1]; return($newfile); } else { return($file_name); } } ?> stephane dot fidanza
Support of the $suffix parameter has changed between PHP4 and PHP5: in PHP4, $suffix is removed first, and then the core basename is applied. conversely, in PHP5, $suffix is removed AFTER applying core basename. Example: <?php $file = "path/to/file.xml#xpointer(/Texture)"; echo basename($file, ".xml#xpointer(/Texture)"); ?> Result in PHP4: file Result in PHP5: Texture) www.turigeza.com
simple but not said in the above examples echo basename('somewhere.com/filename.php?id=2', '.php'); will output filename.php?id=2 which is not the filename in case you expect! phdwight
Pulled my hair out for this. Just like most functions, this does not play well with Japanese characters. When you call basename with some Japanese characters, it will return nothing (truncates it) . pvollma
Note that in my example below, I used the stripslashes function on the target string first because I was dealing with the POST array $_FILES. When creating this array, PHP will add slashes to any slashes it finds in the string, so these must be stripped out first before processing the file path. Then again, the only reason I can think of that basename() would fail is when dealing with Windows paths on a *nix server -- and the file upload via POST is the only situation I can think of that would require this. Obviously, if you are not dealing with these additional slashes, invoking stripslashes() first would remove the very separators you need extract the file name from the full path.
giovanni
No comments here seems to take care about UNIX system files, which typically start with a dot, but they are not "extensions-only". The following function should work with every file path. If not, please let me know at my email address. <?php function remove_ext($str) { $noext = preg_replace('/(.+)\..*$/', '$1', $str); print "input: $str\n"; print "output: $noext\n\n"; } remove_ext("/home/joh.nny/test.php"); remove_ext("home/johnny/test.php"); remove_ext("weirdfile."); remove_ext(".hiddenfile"); remove_ext("../johnny.conf"); 19-sep-2006 07:28
lazy lester is just confirming what icewind said. And yes it is correct! unlike what the following comment after icewind says, as that example is the same with the line order reversed! as poniestail at gmail dot com says. But poniestail at gmail dot com missed the point that if the url is coming from a log file it will not have its value in $_SERVER["QUERY_STRING"] or $_SERVER["SCRIPT_NAME"] but in a LOG FILE or a DATABASE lazy lester
If your path has a query string appended, and if the query string contains a "/" character, then the suggestions for extracting the filename offered below don't work. For instance if the path is like this: http://www.ex.com/getdat.php?dep=n/a&title=boss Then both the php basename() function, and also the $_SERVER[QUERY_STRING] variables get confused. In such a case, use: <php $path_with_query="http://www.ex.com/getdat.php?dep=n/a&title=boss"; $path=explode("?",$path_with_query); $filename=basename($path[0]); $query=$path[1]; ?> komashooter
if you want the name of the parent directory <?php $_parenDir_path = join(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1),"/").'/'; // returns the full path to the parent dir $_parenDir = basename ($_parenDir_path,"/"); // returns only the name of the parent dir // or $_parenDir2 = array_pop(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1)); // returns also only the name of the parent dir echo('$_parenDir_path = '.$_parenDir_path.' '); echo('$_parenDir = '.$_parenDir.' '); echo('$_parenDir2 = '.$_parenDir2.' '); ?> osanim
If you want know the real directory of the include file, you have to writte: <?php dirname(__FILE__) ?> mike
If you are trying to get the file extension of a given file then you should see the function pathinfo(), exploding by '.' on basename() is also possible (as long as you use the last array entry). <?PHP // Make an array of the various attributes $path_parts = pathinfo('/www/htdocs/index.html'); $extension = $path_parts['extension']; echo $extension; // 'html' ?> Hope this helps someone. 15-nov-2005 12:57
icewinds exmaple wouldn't work, the query part would contain the second char of the filename, not the query part of the url. <? $file = "path/file.php?var=foo"; $file = explode("?", basename($file)); $query = $file[1]; $file = $file[0]; ?> That works better. b_r_i_a__n
I was looking for a way to get only the filename whether or not I had received the full path to it from the user. I came up with a much simpler (and probably more robust) method by using the power of basename in reverse: $infile = "/usr/bin/php"; $filename = stristr ($infile,basename ($infile)); This even works on those _wacky_ filenames like "/usr/lib/libnetsnmp.so.5.0.9" which are not factored when exploding the full path and taking out only the last segment after "." komashooter
Exmaple for exploding ;) the filename to an array <?php echo(basename ($PHP_SELF)." "); // returnes filename.php $file = basename ($PHP_SELF); $file = explode(".",$file); print_r($file); // returnes Array ( [0] => filename [1] => php ) echo(" "); $filename = basename(strval($file[0]),$file[1]); echo($filename." "); // returnes filename echo(basename ($PHP_SELF,".php")." "); // returnes filename echo(" "); echo(" "); //show_source(basename ($PHP_SELF,".php").".php") show_source($file[0].".".$file[1]) ?> poniestail
examples from "icewind" and "basname" seem highly overdone... not to mention example from "basename" is exactly the same as one from "icewind"... possibly a more logical approach? <? //possible URL = http://domain.com/path/to/file.php?var=foo $filename = substr( $_SERVER["SCRIPT_NAME"], 1 ); //substr( ) used for optional removal of initial "/" $query = $_SERVER["QUERY_STRING"]; ?> to see the entire $_SERVER variable try this: <? echo "<pre> ".print_r( $_SERVER, true )." </pre> "; ?> icewind
Because of filename() gets "file.php?var=foo", i use explode in addition to basename like here: $file = "path/file.php?var=foo"; $file = explode("?", basename($file)); $file = $file[0]; $query = $file[1]; Now $file only contains "file.php" and $query contains the query-string (in this case "var=foo"). tomboshoven
basename() also works with urls, eg: basename('http://www.google.com/intl/en/images/logo.gif'); will return 'logo.gif'. thoughts
Basename without query string: <?php $filename = array_shift(explode('?', basename($url_path))); ?> roth
Attention: This function is NOT UTF-8 safe. If the filename starts with an utf8 character, this character will be cut off. Example: basename('Ãbergabe')='bergabe' Work around: Just insert a space at the beginning of the string: basename(' Ãbergabe')=' Ãbergabe' Use this call as workaround: ltrim(basename(' '+$s)) daijoubu_nosp
An faster alternative to: <?php array_pop(explode('.', $fpath)); ?> would be: <?php substr($fpath, strrpos($fpath, '.')); // returns the dot ?> If you don't want the dot, simply adds 1 to the position <?php substr($fpath, strrpos($fpath, '.') + 1); // returns the ext only ?> thovan
After reading all of the earlier comments, I made my own function file_basename(): <?php function file_basename($file= null) { if($file=== null || strlen($file)<= 0) { return null; } $file= explode('?', $file); $file= explode('/', $file[0]); $basename= $file[count($file)-1]; return $basename; } ?> crash
A simple way to return the current directory: $cur_dir = basename(dirname($_SERVER[PHP_SELF])) since basename always treats a path as a path to a file, e.g. /var/www/site/foo/ indicates /var/www/site as the path to file foo jonmsawyer
@antrik at users dot sf dot net > 15-Nov-2004 10:40 > When using basename() on a path to a directory > ('/bar/foo/'), the last path component ('foo') is returned, > instead of the empty string one would expect. (Both PHP > 4.1.2 and 4.3.8 on GNU/Linux.) No idea whether this is > considered a bug or a feature -- I found it extremely > annoying. Had to work around using: <?php > $file=substr($path, -1)=='/'?'':basename($path) > ?> Watch out! There is a reason behind this -- and it has nothing to do with being a feature. PHP was heavily modeled off of the POSIX model. Many of the same functions you see in PHP are also in C, C++, and Java. These languages are modeled on POSIX as well. The directory '/bar/foo/', when passed into the function basename(), will output 'foo' because *everything*, including directories, in the POSIX model, is a _file_. Most unix platforms, and all Windows platforms are (some Linux distributions are not) fully compliant to the POSIX model. For example, the device file that contains information about your harddisk, in Linux, is probably stored in the _file_ /dev/hda. Another example is that when you want to list information about your CPU or Memory using the Linux kernel, you might read the _file_ /proc/cpu/info. Directories are no exception. Directories are no more different than your regular text file -- other than the fact that they describe a _file_-list of all files under it, and where the OS can access them. This means that even directories treat other directories as files. The reason why we are made to think that directories are not files is because the kernel (the OS) simply treats these culprits differently. Your OS is lying to you! When you try to open up c:\windows in Notepad, you simply get a runaround because the Windows operating system knows it is a directory and knows how to treat it -- and knowing this it will not let you open it up for editing. For if you did that, you would probably lose the data in that directory. If you are familiar with C programming, you will know that if you lose information about a pointer to an object, the object gets lost in memory. The same would happen if you modified a directory in the wrong way. This is why the operating system protects its directories with the upmost care. (Some do anyway, hehe) So when doing any kind of programming in PHP, C/++, Java, Ada, Perl, Python, Ruby, FORTRAN, and yes, even RPG IV (for all of you AS/400 folks out there working on the IFS), you must treat directories as files well. This is why 'foo' is returned. For more information on POSIX, see http://en.wikipedia.org/wiki/POSIX I hope this helps. Cheers. |
Change Languagebasename chgrp chmod chown clearstatcache copy delete dirname disk_free_space disk_total_space diskfreespace fclose feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype flock fnmatch fopen fpassthru fputcsv fputs fread fscanf fseek fstat ftell ftruncate fwrite glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable lchgrp lchown link linkinfo lstat mkdir move_uploaded_file parse_ini_file pathinfo pclose popen readfile readlink realpath rename rewind rmdir set_file_buffer stat symlink tempnam tmpfile touch umask unlink |