this function isn't very well tested
here's my working version (well on FreeBSD with 4.1.1 in mod_php4 on Apache anyway)
====================
function crackpath($path) {
$sep = strpos($path, "/") > -1 ? "/" : "\\";
$parts = explode($sep, $path);
$file = $parts[sizeof($parts)-1];
$pi = pathinfo($file);
$dir = implode($sep, array_slice($parts, 0, -1));
(!$dir && $file) && $dir = ".";
$lenex = strlen($pi["extension"]);
if($lenex)
$pi["basename"] = substr($file, 0, - ($lenex+1));
else
$file && $pi["basename"] = $file;
$pi["basename"];
$dir && $pi["dirname"] = $dir ? $dir : ".";
return $pi;
}
========================
print_r(pathinfo("/foo/bar.bar/baz"));
/* wrong answer
Array
(
[dirname] => /foo/bar.bar
[basename] => baz
[extension] => bar/baz
)
*/
print_r(crackpath("/foo/bar.bar/baz"));
/* right answer
Array
(
[dirname] => /foo/bar.bar
[basename] => baz
)
*/
print_r(pathinfo("/foo/bar.bar/baz/"));
/* wrong again
Array
(
[dirname] => /foo/bar.bar
[basename] => baz
[extension] => bar/baz/
)
*/
print_r(crackpath("/foo/bar.bar/baz/"));
/* right
Array
(
[dirname] => /foo/bar.bar/baz
[basename] =>
)
*/
print_r(crackpath("\\foo\\bar.bar\\baz"));
/* ooh i do windows too
Array
(
[dirname] => \foo\bar.bar
[basename] => baz
)
*/
print_r(pathinfo(""));
/* bah don't use array_key_exists to check for filename !
Array
(
[basename] =>
)
*/
print_r(crackpath(""));
/* better copy this "broken" functionality
Array
(
[basename] =>
)
*/
print_r(pathinfo("/foo/bar."));
/* interesting
Array
(
[basename] => bar.
[dirname] => foo
)
*/
print_r(crackpath(""));
/* better copy this too
Array
(
[basename] => bar.
[dirname] => foo
)
*/