Лучший способ обработки разделения пути 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
)
То есть конечные косые черты отсутствуют в исправленных массивах
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);
Я знаю, что вы уже приняли ответ, но есть очень простое, однострочное решение этой проблемы, которое я использую регулярно, и я чувствую, что его нужно опубликовать здесь:
$pathParts = explode('/', rtrim(str_replace('\\', '/', $path)));Это заменяет обратную косую черту на переднюю косую черту, обрезает любые задние косые черты и взрывается. Это можно сделать безопасно, так как пути windows не могут содержать косые черты, а пути linux не могут содержать обратные косые черты.
Результирующий массив не выглядит точно как тот, который вы описали выше-корневая часть пути не будет содержать косой черты - но на самом деле она лучше представлена таким образом в любом случае. Это происходит потому, что корень пути (т. е.
C:\или '/') на самом деле не так полезен, когда он хранится с косыми чертами. В результате этого вы можете вызватьimplode('/', $pathParts);и получить допустимый путь назад, тогда как с массивом вы получите дополнительную косую черту в корне. Кроме того,\Users\User\My Documents(без буквы диска) по-прежнему является допустимым путем в Windows, он просто подразумевает текущую работу объем.
Comments