PHP glob () в скобках - PullRequest
       3

PHP glob () в скобках

6 голосов
/ 02 декабря 2011

На Windows-машине следующий скрипт:

<?php

mkdir("c:\\[test]");
file_put_contents("c:\\[test]\\test.txt", "some content");
chdir("c:\\[test]");
echo getcwd()."\n";
var_dump(glob('*'));

?>

Показывает это:

C:\[test]
array(0) {
}

Когда это ожидается:

C:\[test]
array(1) {
    [0]=>
    string(8) "test.txt"
}

Я понимаю, что glob обрабатывает скобки как специальные символы, при обнаружении в параметре pattern.

Шаблон * соответствует любому файлу в текущем рабочем каталоге. Однако glob () ведет себя так, как если бы он был запущен с шаблоном c:\\[test]\\*

Скобки тогда интерпретируются как часть шаблона, когда на самом деле они являются частью каталога.

Предполагается ли glob трактовать путь как часть шаблона ? Я бы предпочел использовать текущий каталог в качестве отправной точки , а затем обработайте только шаблон .

(попытка суммировать): функция glob действует так, как будто получает c:\\[test]\\* в качестве шаблона совпадения, и пытается сопоставить либо c:\t\*, c:\e\*, либо c:\s\*. Но шаблон на самом деле *, и он не должен пытаться сопоставить что-либо из этого.

1 Ответ

4 голосов
/ 08 мая 2012

Похоже, что эта проблема рассматривается в отчете об ошибке на php.net: https://bugs.php.net/bug.php?id=33047

Последнее сообщение в этой теме о том, что это не ошибка, а проблема из-за того, как обрабатывает globскобки, как часть регулярного выражения.Я не уверен, что согласен.Кажется, что вы можете обойти это, если вы не можете перейти вверх в родительскую папку.

Если вы уберете первое требование нахождения во внутренней папке [test], вы можете получить список файлов, используя синтаксискак показано ниже:

chdir('..');
$glob = glob("[[]test[]]/*");

Учитывая эти сложности, я бы порекомендовал не использовать функцию glob, если вы сталкиваетесь с проблемами на компьютерах с Windows, и посмотрите на другие функции листинга файлов, такие как readdir .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...