2010-04-19 13 views

risposta

6

Ecco il mio 1: 1 riscrittura del normpath() metodo dal posixpath.py di Python in 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 '.'; 
} 

Ciò funzionerà esattamente lo stesso di os.path.normpath() in Python

2

Sì, il comando realpath restituirà un percorso normalizzato. È simile a una versione combinata di Python os.path.normpath e os.path.realpath.

Tuttavia, risolverà anche i collegamenti simbolici. Non sono sicuro di cosa faresti se non volessi quel comportamento.

+0

Realpath di PHP sarebbe più simile all'equivalente di os.path.abspath() o os.path.realpath() – VolkerK

+0

@Gordon: il percorso in PHP è più simile a una versione combinata di os.path.normpath e os.path di Python. realpath. – Powerlord

+0

Penso che questo sia il più vicino possibile alla funzionalità 'os.path.normpath()'. O questo o non c'è (almeno) la funzione built-in per questo. Dipende da cosa l'OP ha davvero bisogno ... –

Problemi correlati