Очистка путей к файлам в PHP

Есть ли в PHP функция, которая может выполнять логику, аналогичную realpath(), но с файлами, которых может не быть в файловой системе? Очевидно, что он не сможет разрешать ссылки и т. д., но моя цель — увидеть, находится ли путь, указанный пользователем, в определенном каталоге (или подкаталоге этого каталога) без учета /.././ Путь типы вопросов самостоятельно. Вызов realpath был бы идеальным, если бы он не возвращал false, когда файл не существует.


person jmkelm08    schedule 21.02.2012    source источник
comment
Если он не должен возвращать false, что он должен возвращать?   -  person Andreas Stokholm    schedule 22.02.2012
comment
пользователи, предоставляющие пути на вашем сервере, звучат как плохая идея для начала.   -  person    schedule 22.02.2012
comment
возможно, php.net/manual/en/function.pathinfo.php помогу   -  person Kuba    schedule 22.02.2012
comment
Вы всегда можете создать функцию, используя dir.   -  person Marcin Necsord Szulc    schedule 22.02.2012
comment
В идеале он мог бы взять что-то вроде /var/www/foo/../bar и вернуть /var/www/bar, даже если этот путь не существует (уже есть другая встроенная функция PHP, которая может сказать мне, существует ли файл или нет, так что мне это тоже не нужно)   -  person jmkelm08    schedule 22.02.2012
comment
если он возвращает false, попробуйте открыть его для записи   -  person miki    schedule 22.02.2012


Ответы (2)


Если вас беспокоят только файлы, попробуйте:

function unrealpath($path){
  $rp = realpath(dirname($path));
  if( false === $rp )
    return false;
  return $rp.basename($path);
}

Если у вас есть опасения по поводу существующих или не существующих каталогов, это не сработает.

person scragar    schedule 24.02.2012

Если вам нужно только удалить /../, самописная функция не будет такой сложной. Просто разделите строку на массив, выполните итерацию по массиву и вставьте значения в новый. Если вы нажмете .. удалите последний элемент, вставленный в новый массив. Затем объедините второй массив обратно в строку.

person Johni    schedule 21.02.2012
comment
Я не решался сделать это только потому, что слышал о хаках, которые люди использовали, когда они делали такие вещи, как указание многобайтового представления '.' характер, чтобы обойти людей, наивно зачищающих '.' символ. Может быть, мне не нужно беспокоиться об этих вещах в PHP? - person jmkelm08; 22.02.2012
comment
На самом деле, я понятия не имею, интерпретирует ли php эти многобайтовые файлы. как действие каталога вверх. Стоит попробовать самому, если это так. Если у меня будет время, я тоже попробую. - person Johni; 25.02.2012