0

我不需要is_dir()关心文件夹或参数是大写还是小写,或者是大写和小写的混合。

因此,如果文件夹名称是“我的文件夹”并且我运行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

您可以使用正则表达式。我不太确定 php 中的语法:

is_dir("[mM][yY] [fF][oO][lL][dD][eE][rR]")

他们可能会更好regexp

于 2011-03-18T12:24:29.027 回答
1

我遇到了需要验证目录路径的问题。我不想在不同情况下混合使用类似名称的目录。即my\dirMy\Dir。我尝试了Filip glob('{mM}{yY} {fF}{oO}{lL}{dD}{eE}{rR}', GLOB_BRACE)提到的 grep 方法,但我发现如果目录名称长于大约 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() 名称与所需名称进行比较

于 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]/'

但由于只知道dir一些大写字母发生了变化,我认为更好的功能应该是:

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 回答