- getenv: documentation ( source)
- rtrim: documentation ( source)
- dirname: documentation ( source)
- array_reduce: documentation ( source)
- putenv: documentation ( source)
- explode: documentation ( source)
- preg_replace: documentation ( source)
<?php
$test = '~/test/../test2/test3/../file.php';
// Fake home setting.
putenv( 'HOME=/Users/alain' );
function get_home_directory() {
// Unix.
$home = getenv( 'HOME' );
if ( ! empty( $home ) ) {
return rtrim( $home, '/' );
}
// Windows.
if ( ! empty( $_SERVER['HOMEDRIVE'] ) && ! empty( $_SERVER['HOMEPATH'] ) ) {
$home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH'];
return rtrim( $home, '\\/' );
}
return '~';
}
function get_normalized_path($path) {
return array_reduce(explode('/', $path), function( $a = '/', $b ) {
switch ( $b ) {
case '':
case '.':
return $a;
case '..':
return dirname( $a );
case '~':
return get_home_directory();
default:
return preg_replace("/\/+/", "/", "$a/$b");
}
} );
}
echo $test . PHP_EOL;
echo get_normalized_path( $test ) . PHP_EOL;