如何使php中的is_dir($ FoLdEr)不区分大小写?

时间:2009-12-07 09:31:18

标签: php case-insensitive

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

因此,如果foldername是“我的文件夹”并且我运行is_dir("mY FoLdEr"),则结果应为true

5 个答案:

答案 0 :(得分:7)

这不取决于PHP。这取决于PHP运行的操作系统和文件系统。 Windows不区分大小写,但每个版本的Unix / Linux都区分大小写。

让我换一种说法:is_dir()基本上是系统调用的包装器,或者它将使用文件信息的系统调用结果。如果通过该操作系统和文件系统的规则找到具有匹配名称的文件,那些系统调用将返回或不返回。 PHP无法改变这一点,所以不能让你is_dir()在Linux上不区分大小写。

您可以做的最好的事情是获取目录中的文件列表并循环浏览它们以测试是否有任何匹配与您要查找的内容不区分大小写。

注意:您可能会获得多次点击,例如“HOME”和“Home”都会匹配“home”。在这种情况下,这样的功能(你想要的)会做什么?

或者,您可以将所有文件名更改为小写,然后您可以使用输入的小写版本来查找指定的文件。

答案 1 :(得分:1)

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

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

它们可能是更好的regexp

答案 2 :(得分:0)

肮脏的方式可能是获取实际目录中所有目录的列表并比较他们的strtolower() - 带有所需名称的名称

答案 3 :(得分:0)

我遇到了需要验证目录路径的问题。我不想在不同的情况下混合使用类似的名称目录。即 my \ dir 我的\ 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);

答案 4 :(得分: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/') )
相关问题