【问题标题】:How to determine if a file path is absolute?如何确定文件路径是否为绝对路径?
【发布时间】:2014-06-27 12:39:04
【问题描述】:

如何确定文件路径是否为绝对路径?必须在 Windows 和 Linux 上运行。

【问题讨论】:

  • 检查是否有冒号:?以http://https://file:///C:/ 开头的路径都是绝对的。您还可以查看路径是否以/~ 开头。
  • @LoganMurphy Unix 没有
  • 你读过这个,也许有用? stackoverflow.com/questions/7392274/…
  • @xd6_ Unix 没有什么?
  • @LoganMurphy 抱歉,Unix/linux 不要在路径中使用冒号问题也需要 linux 兼容性

标签: php linux windows path


【解决方案1】:

这里我尝试用一​​个函数来做:

function isAbsolutePath($path) {
    if (!is_string($path)) {
        $mess = sprintf('String expected but was given %s', gettype($path));
        throw new \InvalidArgumentException($mess);
    }
    if (!ctype_print($path)) {
       $mess = 'Path can NOT have non-printable characters or be empty';
       throw new \DomainException($mess);
    }
    // Optional wrapper(s).
    $regExp = '%^(?<wrappers>(?:[[:print:]]{2,}://)*)';
    // Optional root prefix.
    $regExp .= '(?<root>(?:[[:alpha:]]:/|/)?)';
    // Actual path.
    $regExp .= '(?<path>(?:[[:print:]]*))$%';
    $parts = [];
    if (!preg_match($regExp, $path, $parts)) {
        $mess = sprintf('Path is NOT valid, was given %s', $path);
        throw new \DomainException($mess);
    }
    if ('' !== $parts['root']) {
        return true;
    }
    return false;
}

我从我的一个项目中获取了这个,在处理文件和路径时你可能会发现它很有用: dragonrun1/file_path_normalizer

【讨论】:

  • 看不出有什么问题。会接受。谢谢!
  • 这是从 StackOverflow 答案复制粘贴的解决方案。我更感兴趣的是目前是否有一个“成功”或“事实上的标准”解决方案已经在 StackOverflow 之外建立了存在,比如可以使用 composer 或其他东西安装的库。是否有“事实上的标准”路径实用程序库?
  • 如果您查看我上面的答案,我会提供我所做的项目的链接,该项目也可以通过 composer 获得。
  • 我在 Windows 上遇到了麻烦 - 我不得不更改根捕获组以允许使用反斜杠,而不仅仅是正斜杠。旧:$regExp .= '(?&lt;root&gt;(?:[[:alpha:]]:/|/)?)'; 新:(?&lt;root&gt;(?:[[:alpha:]]:[/\\\\]|/)。注意4反斜杠的使用,第一个和第三个是做PHP级别的转义,第二个是做regex级别的转义。
  • 如果你从我的库中查看最新版本,你会发现我已经改变了很多方法,只是用正斜杠替换所有反斜杠以在路径中开始,因为 Windows 也是允许他们。
【解决方案2】:

这是我想出的:

function is_absolute_path($path) {
    if($path === null || $path === '') throw new Exception("Empty path");
    return $path[0] === DIRECTORY_SEPARATOR || preg_match('~\A[A-Z]:(?![^/\\\\])~i',$path) > 0;
}

我认为这涵盖了 Windows 的所有 possible 根路径。

【讨论】:

  • 对于具有wrappers 的路径仍然会中断。试试 'zlib://c:/dummy/path/' 或 'file://c:/dummy/path'
  • @Dragonaire Node 也为这两个示例返回 false,我认为这是正确的答案。我们在这里讨论的是 文件 路径,而不是 URL。
  • 猜你需要阅读我提供的包装链接,因为它们与 URL 本身无关。您可以使用它们来实现诸如围绕流的 ftp 之类的事情,但是您拥有 file:// ,它不再做任何事情,然后在流资源中创建一个本地文件,而不仅仅是一个字符串。 Node(JS) 不理解特定于 PHP 的东西这一事实也不让我感到惊讶;)
  • @Dragonaire 是的,但这不是重点。这取决于您的用例。例如,如果我接受来自用户的文件路径,我是否要允许他们指定包装方法?可能不会。
  • 这就是我在我的小库中添加不允许它们的选项的原因之一 ;)
猜你喜欢
  • 2021-10-18
  • 2014-03-09
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2011-11-25
  • 2012-07-09
相关资源
最近更新 更多