php - 如何在 PHP 中获取不存在文件的规范化路径(真实路径)?

标签 php path canonicalization realpath

script.php

$filename = realpath(sprintf("%s/%s", getcwd(), $argv[1]));
var_dump($filename);

让我们尝试一些东西

[/foo/bar/bof] $ php script.php ../foo.txt
string(16) "/foo/bar/foo.txt"

[/foo/bar/bof] $ php script.php ../nonexistent.txt
bool(false)

该死! realpath 返回 false,因为该文件不存在。

对于 ../nonexistent.txt,我希望看到的是

string(24) "/foo/bar/nonexistent.txt"

如何获取 PHP 中任何相对路径的规范化路径?

注意:我看到了一些关于解析符号链接(symbolic link)路径的问题。这些问题的答案不适用于我的问题。

最佳答案

这是我能想到的最好的

function canonicalize_path($path, $cwd=null) {

  // don't prefix absolute paths
  if (substr($path, 0, 1) === "/") {
    $filename = $path;
  }

  // prefix relative path with $root
  else {
    $root      = is_null($cwd) ? getcwd() : $cwd;
    $filename  = sprintf("%s/%s", $root, $path);
  }

  // get realpath of dirname
  $dirname   = dirname($filename);
  $canonical = realpath($dirname);

  // trigger error if $dirname is nonexistent
  if ($canonical === false) {
    trigger_error(sprintf("Directory `%s' does not exist", $dirname), E_USER_ERROR);
  }

  // prevent double slash "//" below
  if ($canonical === "/") $canonical = null;

  // return canonicalized path
  return sprintf("%s/%s", $canonical, basename($filename));
}

它要求路径中的所有目录都存在。路径的 basename 是唯一可以不存在的部分。

如果目录名不存在,将抛出错误。

关于php - 如何在 PHP 中获取不存在文件的规范化路径(真实路径)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23588972/

相关文章:

php - 如何使用PHP(内连接)在SQL中显示多个表的内容

build - 如何在 Intellij IDEA 的构建路径中重新包含一个类?

python - python 中区分大小写的路径比较

svg - 在 SVG 路径中对 SVG 进行动画处理

java - JAVA 1.5 中的 XML 规范化

php - Symfony2 : Redirecting to last route and flash a message?

php - php7 的 zend session 数据库错误

Windows:如何将文件规范化到特殊文件夹?

java - 规范没有根元素的原始 xml 数据

php - 像 stackoverflow 一样的分页