¿Cómo puedo dividir una cadena si es una ruta de tipo MS-DOS O una ruta de tipo Unix?
Pregunta
Tengo una cadena que representa una ruta a un directorio.Quiero dividir la cadena si es una ruta de tipo Unix o una ruta de tipo MS-DOS.
¿Cómo se puede hacer esto?
Por ejemplo:
<?php
$a = some_path1/some_path2/some_path3; // unix type path
$b = some_path1\some_path2\some_path3; // MS-DOS type path
$foo = preg_split("something", $a); // what regex can be used here?
// the above should work with $a OR $b
?>
Solución
Su expresión regular sería
preg_split('_[\\\\/]_', $a);
Las barras invertidas se escaparon de una vez por la cadena y otra vez para el motor de expresiones regulares.
Editar:
Si usted sabe qué tipo de ruta que tenga (por ejemplo, usted sabe que es del tipo del sistema operativo actual) que puede hacer:
preg_split('_' . preg_quote($pathSep, '_') . '_', $a)
Se puede utilizar la constante DIRECTORY_SEPARATOR
en lugar de $pathSep
en función de sus necesidades.
Esto resolvería el problema señalado por la tormenta @Alan
Otros consejos
Si usted está tratando de escribir código portable (Linux, Windows, Mac OS, etc.) y si el separador es siempre el mismo que el separador del servidor, puede hacer lo siguiente:
<?php
$url = 'what/ever/';
$urlExploded = explode(DIRECTORY_SEPARATOR, $url);
?>
Utilice un operador de tubería para hacer coincidir una barra diagonal o una barra invertida:
$foo = preg_split("/\\\|\//", $a);
En este ejemplo, echo $foo[0]
de $a
saldrá some_path1
y echo $foo[0]
de $b
también saldrá some_path1
.
EDITAR: Debes poner comillas alrededor de los valores que estableces. $a
y $b
a.De lo contrario, su código generará un error.
En primer lugar, me parece que es un exceso preg_split aquí; sólo tiene que utilizar explotar con el separador de ruta (que es más rápido, de acuerdo con los documentos de PHP: http://us2.php.net/manual/en/function.preg-split.php ).
Tal vez PHP tiene una manera de encontrar el separador de ruta, similar a os.sep de Python, pero no pudo encontrarlo. Sin embargo, usted podría hacer algo como:
$os = PHP_OS;
if (stristr($os, "WIN")) { $sep = '\\'; } else { $sep = '/'; } #
$pathFields = explode($sep, $pathToFile);
Tenga en cuenta que esto supone que sólo va a funcionar esto en Windows o un sistema similar a Unix. Si es posible ejecutarlo en otro sistema operativo con un separador de ruta diferente, tendrá que hacer chequeos adicionales para asegurarse de que estás en un sistema * nix.