4

私は2つの文字列を持っています:

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

あなたがすでに回答を受け入れていることは知っていますが、私が定期的に使用しているこの問題に対する非常にシンプルな1行の解決策があり、ここに投稿する必要があると感じています:

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

これにより、バックスラッシュがスラッシュに置き換えられ、末尾のスラッシュがあれば削除され、爆発します。Windows パスにはスラッシュを含めることはできず、Linux パスにはバックスラッシュを含めることはできないため、これは安全に行うことができます。

結果の配列は、上記で説明したものとまったく同じには見えません-パスのルート部分にはスラッシュが含まれません-しかし、実際にはとにかくこの方法でよりよく表現されます. これは、パスのルート (C:\または '/') がスラッシュで保存されている場合、実際にはあまり役に立たないためです。この結果、呼び出しimplode('/', $pathParts);て有効なパスを取得できますが、配列を使用すると、ルートに余分なスラッシュが追加されます。また、\Users\User\My Documents(ドライブ文字なしで) は Windows でも有効なパスであり、現在の作業ボリュームを意味するだけです。

于 2011-10-04T21:16:20.243 に答える
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 に答える