4

我有两个字符串:

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

4 回答 4

3

为什么不只检查“/”或“\”,然后使用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>';
?>

(更新了一个稍微整洁的版本)

于 2011-10-04T20:27:04.790 回答
1

使用以下代码,您可以获得所需的内容,但第一个键也将没有斜杠:

preg_split('#(?<=)[/\\\]#', $string);
于 2011-10-04T20:32:59.277 回答
1
$dirs = explode(DIRECTORY_SEPARATOR, $string);
$dirs[0] .= DIRECTORY_SEPARATOR;
于 2011-10-04T20:35:01.507 回答
1

我知道你已经接受了一个答案,但是我经常使用一个非常简单的单行解决方案来解决这个问题,我觉得它需要在这里发布:

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

这用正斜杠替换反斜杠,修剪任何尾随斜杠,然后爆炸。这可以安全地完成,因为 windows 路径不能包含正斜杠,而 linux 路径不能包含反斜杠。

结果数组看起来与您上面描述的不完全一样 - 路径的根部分不会包含斜杠 - 但无论如何它实际上更好地表示这种方式。这是因为路径的根(即C:\或'/')在与斜杠一起存储时实际上并没有那么有用。有了这个结果,你可以调用implode('/', $pathParts);并获得一个有效的路径,而你的数组最终会在根处有一个额外的斜杠。此外,\Users\User\My Documents(没有驱动器号)在 Windows 上仍然是有效路径,它只是暗示当前的工作卷。

于 2011-10-04T21:16:20.243 回答