Лучший способ обработки разделения пути Windows или Linux



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



C:UsersBobMy 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
)


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

591   4  

4 ответов:

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

<?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) . '</pre>';
echo '<pre>' . print_r(mySplit($s2),true) . '</pre>';
?>

(обновлено с немного более аккуратной версией)

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

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

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

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

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

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

Comments

    Ничего не найдено.