Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何确定文件路径是否为绝对路径?_Php_Linux_Windows_Path - Fatal编程技术网

Php 如何确定文件路径是否为绝对路径?

Php 如何确定文件路径是否为绝对路径?,php,linux,windows,path,Php,Linux,Windows,Path,如何确定文件路径是否为绝对路径?必须同时在Windows和Linux上工作。以下是我的想法: 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) >

如何确定文件路径是否为绝对路径?必须同时在Windows和Linux上工作。

以下是我的想法:

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的所有根路径。

这里我尝试使用一个函数:

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;
}
函数isAbsolutePath($path){
如果(!is_string($path)){
$mess=sprintf('应为字符串,但为%s',gettype($path));
抛出新的\InvalidArgumentException($mess);
}
如果(!ctype_print($path)){
$mess='路径不能有不可打印的字符或为空';
抛出新的\DomainException($mess);
}
//可选包装器。
$regExp='%^(?(([:print:]{2,}://)*);
//可选的根前缀。
$regExp.='(?(?:[:alpha:]:/|/)?);
//实际路径。
$regExp.='((?(?:[:print:][]*))$%;
$parts=[];
如果(!preg_匹配($regExp、$path、$parts)){
$mess=sprintf('路径无效,已给定%s',$Path);
抛出新的\DomainException($mess);
}
如果(“”!=$parts['root'])){
返回true;
}
返回false;
}
我从我的一个项目中获取了这一信息,在处理文件和路径时,您可能会发现这一点很有用:

检查它是否有冒号
?以
http://
https://
文件://
C://
开头的路径都是绝对路径。您还可以查看路径是否以
/
~
@LoganMurphy开头。如果您没有阅读此内容,可能有用吗@xd6_uuUNIX没有什么?@LoganMurphy抱歉,Unix/linux在路径中不使用冒号问题要求linux兼容性,但对于具有冒号的路径,该问题仍然会中断。对于这两个示例,请尝试使用“zlib://c:/dummy/path/”或“file://c:/dummy/path”@Dragonaire returns
false
,我认为这是正确的答案。我们这里讨论的是文件路径,而不是URL。我想您需要阅读我提供的包装器链接,因为它们本身与URL无关。您可以使用它们来实现流周围的ftp之类的功能,但是您有file://文件,它不再在流资源中生成一个本地文件,而不仅仅是一个字符串。Node(JS)不理解特定于PHP的内容这一事实也不会让我感到惊讶;)@是的,但这不是重点。这取决于您的用例。例如,如果我接受来自用户的文件路径,是否允许它们指定包装器方法?可能不会。这是我添加选项不允许在我的小库中使用它们的原因之一;)看不出有什么问题。我会接受的。谢谢这是从StackOverflow答案复制粘贴的解决方案。我更感兴趣的是,目前是否有一个“成功的”或“事实上的标准”解决方案已经在StackOverflow之外建立了存在,比如一个可以与composer或其他东西一起安装的库。是否有一个“事实上的标准”路径实用程序库?如果你看我上面的答案,我会提供我所做的项目的链接,该链接也可以通过composer获得。我在Windows上遇到了这个问题-我必须将根捕获组更改为允许反斜杠,而不是只允许正斜杠。旧:
$regExp.='(?(?:[:alpha:]]:/|/)?)新建:
(?(?:[[:alpha:]]:[/\\\\]\\\\]\;/)
。注意使用了4个反斜杠,第一个和第三个是PHP级转义,第二个是正则表达式级转义。如果您查看我的库中的最新版本,您会发现我对该方法做了很多更改,只需将路径中的所有反斜杠替换为正斜杠即可,因为windows也允许这样做。