note 67152 added to ref.filesystem
| From: | tim at astolat dot it | Date: | Sun, 04 Jun 2006 06:03:02 +0000 |
| Subject: | note 67152 added to ref.filesystem | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-113176@lists.php.net to get a copy of this message | ||
Little function to sanitize a user supplied file name, and optionally force a file extension:
function sanitize_filename($filename, $forceextension="")
{
/*
1. Remove leading and trailing dots
2. Remove dodgy characters from filename, including spaces and dots except last.
3. Force extension if specified
*/
$defaultfilename = "none";
$dodgychars = "[^0-9a-zA-z()_-]"; // allow only alphanumeric, underscore, parentheses
and hyphen
$filename = preg_replace("/^[.]*/","",$filename); // lose any leading dots
$filename = preg_replace("/[.]*$/","",$filename); // lose any trailing dots
$filename = $filename?$filename:$defaultfilename; // if filename is blank, provide default
$lastdotpos=strrpos($filename, "."); // save last dot position
$filename = preg_replace("/$dodgychars/","_",$filename); // replace dodgy
characters
$afterdot = "";
if ($lastdotpos !== false) { // Split into name and extension, if any.
$beforedot = substr($filename, 0, $lastdotpos);
if ($lastdotpos < (strlen($filename) - 1))
$afterdot = substr($filename, $lastdotpos + 1);
}
else // no extension
$beforedot = $filename;
if ($forceextension)
$filename = $beforedot . "." . $forceextension;
elseif ($afterdot)
$filename = $beforedot . "." . $afterdot;
else
$filename = $beforedot;
return $filename;
}
echo sanitize_filename("..file<>@**()name.ddd.badextension",
"extension")."\n";
echo sanitize_filename("..file<>@**()name.extension.ddd")."\n";
echo sanitize_filename("...", "extension")."\n";
echo sanitize_filename("...")."\n";
echo sanitize_filename("filename")."\n";
echo sanitize_filename("filename", "extension")."\n";
echo sanitize_filename(".xyz...xxx..", "extension")."\n";
echo sanitize_filename(".xyz...xxx..", "")."\n";
produces
file_____()name_ddd.extension
file_____()name_extension.ddd
none.extension
none
filename
filename.extension
xyz__.extension
xyz__.xxx
----
Server IP: 66.163.161.117
Probable Submitter: 84.92.164.25
----
X-Spam-Status: No, hits=3.1 required=5.0 tests=DATE_MISSING,FROM_NO_LOWER
autolearn=no version=2.64
----
Manual Page -- http://www.php.net/manual/en/ref.filesystem.php
Edit -- http://master.php.net/note/edit/67152
Del: integrated -- http://master.php.net/note/delete/67152/integrated
Del: useless -- http://master.php.net/note/delete/67152/useless
Del: bad code -- http://master.php.net/note/delete/67152/bad+code
Del: spam -- http://master.php.net/note/delete/67152/spam
Del: non-english -- http://master.php.net/note/delete/67152/non-english
Del: in docs -- http://master.php.net/note/delete/67152/in+docs
Del: other reasons-- http://master.php.net/note/delete/67152
Reject -- http://master.php.net/note/reject/67152
Search -- http://master.php.net/manage/user-notes.php