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