2011-04-12 1 views
7

La mia semplice preoccupazione è riuscire a gestire i percorsi tra i sistemi operativi, principalmente per quanto riguarda le barre di back e forward per i separatori di directory.PHP: un buon modo per universalizzare i percorsi tra SO (slash directions)

stavo usando DIRECTORY_SEPARATOR, però:

  1. E 'tempo per scrivere

  2. percorsi possono provenire da fonti diverse, non necessariamente controllato da voi

I' m attualmente in uso:

function pth($path) 
    { 
     $runningOnWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); 
     $slash = $runningOnWindows ? '\\' : '/'; 
     $wrongSlash = $runningOnWindows ? '/' : '\\' ; 
     return (str_replace($wrongSlash, $slash, $path)); 
    } 

Voglio solo sapere che non c'è nulla di esistente nella lingua che sto reinventare,

C'è già un PHP functon integrato per fare questo?

+0

V'è la costante 'DIRECTORY_SEPARATOR' che tiene separatore la corrente del sistema operativo. Ti aiuterà perché non hai bisogno di controllare 'runningOnWindows'. Devi solo fare in modo che la tua funzione converta tutti i tipi di barre * tranne * quella definita in 'DIRECTORY_SEPARATOR' –

risposta

25

Sono consapevole di DIRECTORY_SEPARATOR,

Tuttavia: 1. E 'tempo per scrivere

La pigrizia non è mai una ragione per tutto ciò

$path = (DIRECTORY_SEPARATOR === '\\') 
     ? str_replace('/', '\\', $subject) 
     : str_replace('\\', '/', $subject); 

o

$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); 

Questo in un passo sostituirà "quello giusto" con se stesso, ma questo non fa alcuna differenza.

Se si sa per certo, che esista un percorso, è possibile utilizzare realpath()

$path = realpath($path); 

Tuttavia, ciò non è richiesto a tutti, perché ogni sistema operativo capisce la barra / come separatore di directory valida (anche finestre).

+0

All'inferno, puoi persino mescolare le barre su Windows. ' 'C: \ Foo \ Bar/baz/cosa.php'' è totalmente un percorso legale in PHP. – Charles

+0

Hehe, sì, non c'è davvero alcun motivo per pensarci. Per quanto ne so c'è esattamente un'eccezione, in cui fa la differenza per vincere http://php.net/domdocument.load Anche la soluzione è menzionata lì;) – KingCrunch

+0

"puoi anche mescolare le barre su Windows". Ecco un esempio in cui questo non funzionava su windows: exec ("rd path \ con/mixed/slashes") considerava/come chiave per il comando – shealtiel

3

Ti manca la costante predefinita DIRECTORY_SEPARATOR.

+1

Beh, non è sufficiente per quello che vuole fare (Costruire un metodo generico per convertire * qualsiasi * percorso nel formato del sistema operativo corrente). Ma è un inizio –

+0

@Pekka: Certo. Ma può perdere il rilevamento del sistema operativo personalizzato, che IMHO è la cosa più spiacevole in quel codice. – Jon

1

Se passi questi percorsi alle funzioni PHP standard, in realtà non è necessario correggere i percorsi, per quanto ne so. Funzioni di base come file_get_contents o fopen funzionano perfettamente con qualsiasi tipo di percorso si passi a loro.

0
static function fx_slsh($path) { 
    $path = str_replace(['/','\\'], DIRECTORY_SEPARATOR, $path); 
    return substr($path, -1) == DIRECTORY_SEPARATOR ? $path : $path . DIRECTORY_SEPARATOR; 
    } 

questo sarà anche assicurarsi che ci sia una barra finale