0

is_dir()フォルダーまたは引数が大文字か小文字か、または大文字と小文字の混合であるかどうかを気にする必要はありません。

したがって、フォルダ名が「My Folder」で実行するとis_dir("mY FoLdEr")、結果はtrue.

4

5 に答える 5

8

それはPHPまでではありません。それは、PHPが実行されているオペレーティングシステムとファイルシステム次第です。Windows では大文字と小文字が区別されませんが、Unix/Linux のすべてのバージョンでは大文字と小文字が区別されます。

別の言い方is_dir()をすると、基本的にはシステム コールのラッパーであるか、システム コールの結果をファイル情報に使用します。これらのシステム コールは、そのオペレーティング システムとファイル システムの規則により、一致する名前のファイルが見つかった場合、何かを返すか返さないかのいずれかです。PHP はこれを変更できないためis_dir()、Linux で大文字と小文字を区別しないようにすることはできません。

あなたができる最善の方法は、ディレクトリ内のファイルのリストを取得し、それらをループして、探しているものと大文字と小文字を区別しない比較に一致するかどうかをテストすることです。

注:複数のヒットが表示される場合があります。たとえば、"HOME" と "Home" はどちらも "home" と一致します。この場合、(あなたが望む)そのような機能は何をしますか?

または、すべてのファイル名を小文字に変更してから、入力の小文字バージョンを使用して指定されたファイルを見つけることができます。

于 2009-12-07T09:33:46.393 に答える
1

ディレクトリ パスを検証する必要があるという問題がありました。さまざまなケースで同様の名前のディレクトリを混在させたくありませんでした。つまり、 my\dirMy\Dirです。Filip が言及した grep アプローチを試してglob('{mM}{yY} {fF}{oO}{lL}{dD}{eE}{rR}', GLOB_BRACE)みましたが、ディレクトリ名が約 8 文字を超えると停止してしまうことがわかりました。したがって、これは大文字と小文字を区別しないための私の解決策ですis_dir()

$path  = '/';
$parts = explode(DIRECTORY_SEPARATOR, '/My/DirecTorY/pATh');

foreach($parts as $key => $dir) {
    $isUnique = true;

    if (is_dir($path . DIRECTORY_SEPARATOR . $dir)) {
        $path .= DIRECTORY_SEPARATOR . $dir;
        $isUnique = false;
    } else {
        $iterator = new DirectoryIterator($path);
        $name = strtolower($dir);

        foreach($iterator as $file) {
            $filename = $file->getFilename();
            if($file->isDir() && strtolower($filename) == $name) {
                $path .= DIRECTORY_SEPARATOR . $filename;
                $isUnique = false;
                break;
            }
        }
    }

    if($isUnique) {
        $path .= DIRECTORY_SEPARATOR 
              . implode(DIRECTORY_SEPARATOR, array_slice($parts, $key));
        break;
    } 
}

var_dump($isUnique, $path);
于 2013-10-30T15:29:43.170 に答える
0

汚い方法は、実際のディレクトリ内のすべてのディレクトリのリストを取得し、それらの strtolower()-ed 名を目的の名前と比較する可能性があります

于 2009-12-07T09:37:28.697 に答える
0

ここに私の解決策があります:

function is_dir_ci($path){
    $glob_path='';
    for ($i=0; $i<strlen($path); $i++) {
        if(preg_match('/^\p{Latin}+$/',$path[$i])){
            $glob_path.='['.strtolower($path[$i]).strtoupper($path[$i]).']';
        }else 
            $glob_path.=$path[$i];
    }
    return !empty(glob($glob_path,GLOB_BRACE));
}

is_dir_ci('/path/With/Cap-Case or not/');

基本的にパスを変換します

'/path/With/Cap-Case or not/'

'/[pP][aA][tT][hH]/[wW][iI][tT][hH]/[cC][aA][pP]-[cC][aA][sS][eE] [oO][rR] [nN][oO][tT]/'

しかし、いくつかの大文字が変更されたディレクトリがあることだけを知っているので、より良い機能は次のようになるべきだと思います:

function get_correct_dir($path){
    $glob_path='';
    for ($i=0; $i<strlen($path); $i++) {
        if(preg_match('/^\p{Latin}+$/',$path[$i])){
            $glob_path.='['.strtolower($path[$i]).strtoupper($path[$i]).']';
        }else 
            $glob_path.=$path[$i];
    }
    return glob($glob_path,GLOB_BRACE);
}

var_export( get_correct_dir('/path/With/Cap-Case or not/') )
于 2020-09-08T15:01:31.453 に答える