Лучший способ справиться с разбиением пути Windows или Linux - PullRequest
4 голосов
/ 05 октября 2011

У меня есть две строки:

C:\Users\Bob\My Documents
/Users/Bob/Documents

Мне удалось создать это регулярное выражение:

preg_split('/(?<=[\/\\\])(?![\/\\\])/', $string)

, который вернет

Array
(
    [0] => C:\
    [1] => Users\
    [2] => Bob\
    [3] => My Documents
)

Array
(
    [0] => /
    [1] => Users/
    [2] => Bob/
    [3] => Documents
)

Однако я ищу

Array
(
    [0] => C:\
    [1] => Users
    [2] => Bob
    [3] => My Documents
)

Array
(
    [0] => /
    [1] => Users
    [2] => Bob
    [3] => Documents
)

т.е. конечные косые черты отсутствуют в исправленных массивах

Ответы [ 4 ]

3 голосов
/ 05 октября 2011

Почему бы просто не проверить "/" или "\", а затем использовать explode с соответствующим разделителем?

<code><?php
$s1 = 'C:\\Users\\Bob\\My Documents';
$s2 = '/Users/Bob/Documents';

function mySplit($s) {
    if(strpos($s, '/') !== false) {
        $d = '/';
    }elseif(strpos($s,'\\') !== false) {
        $d = '\\';
    }else {
        throw new Exception('Valid delimiter not found.');
    }

    $ret = explode($d, $s);
    $ret[0] .= $d;

    return $ret;
}

echo '<pre>' . print_r(mySplit($s1),true) . '
'; echo '
' . print_r(mySplit($s2),true) . '
'; ?>

(обновлено с более чистой версией)

1 голос
/ 05 октября 2011

Я знаю, что вы уже приняли ответ, но есть очень простое, однострочное решение этой проблемы, которое я регулярно использую, и я чувствую, что его нужно опубликовать здесь:

$pathParts = explode('/', rtrim(str_replace('\\', '/', $path)));

Заменяет обратную косую черту на прямую, убирает любые конечные и взрывается. Это можно сделать безопасно, поскольку пути Windows не могут содержать косую черту, а пути Linux не могут содержать обратную косую черту.

Полученный массив не выглядит точно , как тот, который вы описали выше - корневая часть пути не будет содержать косую черту - но на самом деле он лучше представлен таким образом в любом случае. Это связано с тем, что корень пути (т. Е. C:\ или '/') на самом деле не так полезен, когда хранится с косой чертой. В результате вы можете вызвать implode('/', $pathParts); и получить верный путь назад, тогда как с вашим массивом вы получите дополнительную косую черту в корне. Кроме того, \Users\User\My Documents (без буквы диска) по-прежнему является допустимым путем в Windows, он просто подразумевает текущий рабочий объем.

1 голос
/ 05 октября 2011
$dirs = explode(DIRECTORY_SEPARATOR, $string);
$dirs[0] .= DIRECTORY_SEPARATOR;
1 голос
/ 05 октября 2011

С помощью следующего кода вы получите то, что хотите, но первый ключ также будет без косой черты:

preg_split('#(?<=)[/\\\]#', $string);
...