2010-04-19 33 views

Respuesta

6

Aquí es mi 1: 1 reescritura del método Normpath() desde posixpath.py de Python en PHP:

function normpath($path) 
{ 
    if (empty($path)) 
     return '.'; 

    if (strpos($path, '/') === 0) 
     $initial_slashes = true; 
    else 
     $initial_slashes = false; 
    if (
     ($initial_slashes) && 
     (strpos($path, '//') === 0) && 
     (strpos($path, '///') === false) 
    ) 
     $initial_slashes = 2; 
    $initial_slashes = (int) $initial_slashes; 

    $comps = explode('/', $path); 
    $new_comps = array(); 
    foreach ($comps as $comp) 
    { 
     if (in_array($comp, array('', '.'))) 
      continue; 
     if (
      ($comp != '..') || 
      (!$initial_slashes && !$new_comps) || 
      ($new_comps && (end($new_comps) == '..')) 
     ) 
      array_push($new_comps, $comp); 
     elseif ($new_comps) 
      array_pop($new_comps); 
    } 
    $comps = $new_comps; 
    $path = implode('/', $comps); 
    if ($initial_slashes) 
     $path = str_repeat('/', $initial_slashes) . $path; 
    if ($path) 
     return $path; 
    else 
     return '.'; 
} 

Esto funcionará exactamente lo mismo que os.path.normpath() en Python

2

Sí, el comando realpath devolverá una ruta normalizada. Es similar a una versión combinada de Python os.path.normpath y os.path.realpath.

Sin embargo, también resolverá los enlaces simbólicos. No estoy seguro de lo que harías si no quisieras ese comportamiento.

+0

PHP's realpath sería más como el equivalente de os.path.abspath() o os.path.realpath() – VolkerK

+0

@Gordon: el realpath de PHP es más como una versión combinada de os.path.normpath y os.path de Python. realpath. – Powerlord

+0

Creo que esto es lo más cercano que se puede obtener con la funcionalidad 'os.path.normpath()'. O esto o no hay (al menos) función incorporada para esto. Depende de lo que realmente necesite el OP ... –

Cuestiones relacionadas