2011-04-12 18 views
7

Mi preocupación simple es ser capaz de manejar las rutas en los sistemas operativos, principalmente en lo que respecta a las barras invertidas para los separadores de directorios.PHP: una buena forma de universalizar las rutas en todos los sistemas operativos (direcciones inclinadas)

que estaba usando DIRECTORY_SEPARATOR, sin embargo:

  1. Es tiempo para escribir

  2. caminos pueden provenir de diferentes fuentes, no necesariamente controlado por usted

I' m actualmente en uso:

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

sólo quieren saber que no hay nada que existe en el idioma que estoy reinventando,

¿Existe ya un functon PHP incorporado para hacer esto?

+0

No es la constante 'DIRECTORY_SEPARATOR' que mantiene separador de la corriente del sistema operativo. Te ayudará porque no necesitas comprobar 'runningOnWindows'. Solo necesita hacer que su función convierta todo tipo de barras * excepto * la definida en 'DIRECTORY_SEPARATOR' –

Respuesta

25

Soy consciente de DIRECTORY_SEPARATOR,

Sin embargo: 1. Es tiempo para escribir

La pereza no es una razón para nada

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

o

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

Esto reemplazará en un paso "el correcto" consigo mismo, pero eso no hace ninguna diferencia.

Si sabe a ciencia cierta, que existe una ruta, puede utilizar realpath()

$path = realpath($path); 

Sin embargo, esto no es necesario en absoluto, ya que cada sistema operativo entiende la barra diagonal / como separador de directorio válido (incluso ventanas).

+0

Demonios, incluso puedes mezclar barras en Windows. ''C: \ Foo \ Bar/baz/what.php'' es totalmente una ruta legal en PHP. – Charles

+0

Jeje, sí, realmente no hay ninguna razón para pensar en eso. Por lo que yo sé, hay exactamente una excepción, donde hace una diferencia en win http://php.net/domdocument.load También se menciona la solución allí;) – KingCrunch

+0

"incluso puedes mezclar barras en Windows". Aquí hay un ejemplo cuando esto no funcionó en Windows: exec ("rd path \ with/mixed/slashes") consideró la/como una clave para el comando – shealtiel

3

Te has perdido el DIRECTORY_SEPARATOR constante constante.

+1

Bueno, no es suficiente para lo que quiere hacer (Construya un método genérico para convertir * cualquier * ruta al formato del sistema operativo actual) Pero es un comienzo –

+0

@Pekka: Claro. Pero puede perder la detección del sistema operativo personalizado, que en mi humilde opinión es lo más desagradable en ese código. – Jon

1

Si va a pasar esas rutas a las funciones estándar de PHP, en realidad no es necesario que corrija las rutas, hasta donde yo sé. Las funciones básicas como file_get_contents o fopen funcionan perfectamente bien con cualquier tipo de ruta que les arroje.

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

éste también se asegurará de que hay una barra diagonal

Cuestiones relacionadas