Как сделать is_dir ($ FoLdEr) нечувствительным к регистру в php? - PullRequest
1 голос
/ 07 декабря 2009

Мне нужно is_dir(), чтобы не заботиться о том, является ли папка или аргумент прописными или строчными буквами или сочетание прописных и строчных букв.

Таким образом, если имя папки «Моя папка» и я запускаю is_dir("mY FoLdEr"), результат должен быть true.

Ответы [ 4 ]

7 голосов
/ 07 декабря 2009

Это не до PHP. Это зависит от операционной системы и файловой системы, на которой работает PHP. Windows нечувствительна к регистру, но каждая версия Unix / Linux чувствительна к регистру.

Позвольте мне сказать это по-другому: is_dir() по сути является оберткой для системного вызова или использует результаты системных вызовов для информации о файле. Эти системные вызовы будут либо возвращать что-то, либо нет, если по правилам этой операционной системы и файловой системы найден файл с соответствующим именем. PHP не может изменить это, поэтому вы не можете просто сделать is_dir() нечувствительным к регистру в Linux.

Лучшее, что вы можете сделать, - это получить список файлов в каталоге и просмотреть их, чтобы проверить, не совпадают ли какие-либо из них без учета регистра.

Примечание: вы можете получить несколько попаданий, например, "HOME" и "Home" будут совпадать с "home". Что будет делать такая функция (которую вы хотите) в этом случае?

В качестве альтернативы вы можете изменить все имена файлов на строчные, а затем использовать строчную версию ввода для поиска указанного файла.

1 голос
/ 18 марта 2011

Вы можете использовать регулярные выражения. Я не совсем уверен в синтаксисе в php:

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

Они могут быть лучше regexp.

0 голосов
/ 30 октября 2013

У меня была проблема, когда мне нужно было проверить путь к каталогу. Я не хотел, чтобы в разных случаях были одинаковые имена каталогов. то есть my \ dir и My \ Dir . Я попробовал подход grep, упомянутый Filip 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);
0 голосов
/ 07 декабря 2009

Грязным способом может быть получение списка всех каталогов в реальном каталоге и сравнение их названий strtolower () с желаемым именем

...