¿Cómo puedo dividir una cadena si es una ruta de tipo MS-DOS O una ruta de tipo Unix?

StackOverflow https://stackoverflow.com/questions/1069823

  •  21-08-2019
  •  | 
  •  

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

?>
¿Fue útil?

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);
?>

http://www.php.net/manual/en/dir .constants.php

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top