Как php обрабатывает phar: // обертку, когда целевое имя файла с вопросительным знаком - PullRequest
0 голосов
/ 25 марта 2020

Я заметил, что phar: // wrapper будет игнорировать вопросительный знак ("?") В имени файла, но "?" в zip архиве имя может быть распознано правильно. Как:

$ echo "this is test.js"           > "test.js"
$ echo "this is test.js?ver=1.3.1" > "test.js?ver=1.3.1"
$ zip -r "archive?.zip" ./
   adding: test.js?ver=1.3.1 (stored 0%)
   adding: test.js (stored 0%)

Затем, чтобы прочитать файлы в архиве? .Zip с phar: // wrapper

<?php

$dir = "phar://archive?.zip";
$cdr = scandir($dir);
print_r($cdr);
foreach ($cdr as $fname) {
    $file = $dir . "/" . $fname;
    echo $file . " => " . file_get_contents($file);
}

Вывод:

Array
(
    [0] => test.js
    [1] => test.js?ver=1.3.1
)
phar://archive?.zip/test.js => this is test.js
phar://archive?.zip/test.js?ver=1.3.1 => this is test.js

Как вы видите вывод "phar: // archive? .zip / test. js? ver = 1.3.1" - это не содержимое "test. js? ver = 1.3.1", а "test. js" .

Я знаю, что допустимыми расширениями архива phar являются "tar", "zip" и "phar". Поэтому строку перед .zip можно рассматривать как имя файла даже со специальными символами.

Обратите внимание, что я нашел это: Phar: // потоковая обертка с пробелом в имени файла , но Я получил тот же вывод с urlencode phar://archive?.zip/test.js%3Fver=1.3.1.

Мои вопросы:

  1. Как обрабатывается вопросительный знак в имени файла? Точно так же, как параметры HTTP или напрямую игнорируется?
  2. Возможно ли прочитать содержимое "test. js? Ver = 1.3.1" вместо "test. js"?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...