jjzjj

PHP 路径串联

coder 2024-04-11 原文

是否有用于路径连接的 PHP 内部函数?我有什么可能合并多个路径(绝对和相对)。

//Example: 
$path1="/usr/home/username/www";
$path2="domainname";
$path3="images/thumbnails";
$domain="exampledomain.com";

//As example: Now I want to create a new path (domain + path3) on the fly. 
$result = $domain.DIRECTORY_SEPARATOR.$path3

好的,这个例子有一个简单的解决方案,但是如果有不同的字典分隔符或者某些路径有点复杂怎么办?

是否有像这样修剪它的现有解决方案:/home/uploads/../uploads/tmp =>/home/uploads/tmp ....

独立于平台的路径连接函数版本会是什么样子?

相对路径应该以“./”作为前缀还是以“home/path/img/”开头?

最佳答案

我自己遇到了这个问题,主要是关于路径的规范化

归一化是:

  • 一个分隔符(我选择支持,但从不返回反斜杠 \\)
  • 解析间接:/../
  • 删除重复的分隔符:/home/www/uploads//file.ext
  • 始终删除尾随分隔符。

我已经编写了一个函数来实现这一点。我现在无法访问该代码,但自己编写它也不难。

路径是否绝对对于这个规范化函数的实现并不重要,只要注意前导分隔符就可以了。

我不太担心操作系统依赖性。 Windows 和 Linux PHP 都理解 /,所以为了简单起见,我一直使用它——但我想你使用什么分隔符并不重要。


回答您的问题:如果您始终使用 /假设目录没有尾随分隔符,则路径连接会非常容易. “没有尾随分隔符”似乎是一个很好的假设,因为像 dirname 这样的函数删除了尾随分隔符。

那么这样做总是安全的:$dir。 “/”。 $文件.

即使结果路径是 /home/uploads/../uploads//my_uploads/myfile.ext,它仍然可以正常工作。

当您需要将路径存储在某处时,规范化就很有用了。并且因为您具有此归一化函数,所以您可以做出这些假设。


另一个有用的函数是创建相对路径的函数。

  • /文件/上传
  • /files/uploads/my_uploads/myfile.ext

从这两个路径得出文件的相对路径是什么可能很有用。


真实路径

我发现 realpath 对性能要求极高。如果你只调用一次还不错,但如果你在某个地方循环执行它,你会得到很大的成功。请记住,每个 realpath 调用也是对文件系统的调用。此外,如果您传入一些愚蠢的东西,它只会返回 false,我宁愿让它抛出异常。

对我来说,realpath 函数是BAD 函数 的一个很好的例子,因为它做了两件事:1. 规范化路径和 2. 检查路径是否正确存在。这两个功能当然都有用,但必须分开。它也不区分文件和目录。对于 Windows,这通常不是问题,但对于 Linux,它可能是。

而且我认为在 Windows 上使用 realpath("") 时有些古怪。我认为它会返回 \\ - 这可能是非常 Not Acceptable 。


/**
 * This function is a proper replacement for realpath
 * It will _only_ normalize the path and resolve indirections (.. and .)
 * Normalization includes:
 * - directiory separator is always /
 * - there is never a trailing directory separator
 * @param  $path
 * @return String
 */
function normalize_path($path) {
    $parts = preg_split(":[\\\/]:", $path); // split on known directory separators

    // resolve relative paths
    for ($i = 0; $i < count($parts); $i +=1) {
        if ($parts[$i] === "..") {          // resolve ..
            if ($i === 0) {
                throw new Exception("Cannot resolve path, path seems invalid: `" . $path . "`");
            }
            unset($parts[$i - 1]);
            unset($parts[$i]);
            $parts = array_values($parts);
            $i -= 2;
        } else if ($parts[$i] === ".") {    // resolve .
            unset($parts[$i]);
            $parts = array_values($parts);
            $i -= 1;
        }
        if ($i > 0 && $parts[$i] === "") {  // remove empty parts
            unset($parts[$i]);
            $parts = array_values($parts);
        }
    }
    return implode("/", $parts);
}

/**
 * Removes base path from longer path. The resulting path will never contain a leading directory separator
 * Base path must occur in longer path
 * Paths will be normalized
 * @throws Exception
 * @param  $base_path
 * @param  $longer_path
 * @return string normalized relative path
 */
function make_relative_path($base_path, $longer_path) {
    $base_path = normalize_path($base_path);
    $longer_path = normalize_path($longer_path);
    if (0 !== strpos($longer_path, $base_path)) {
        throw new Exception("Can not make relative path, base path does not occur at 0 in longer path: `" . $base_path . "`, `" . $longer_path . "`");
    }
    return substr($longer_path, strlen($base_path) + 1);
}

关于PHP 路径串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808143/

有关PHP 路径串联的更多相关文章

  1. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  2. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

  3. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  4. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  5. 对象的 Ruby 方法查找路径 - 2

    是否有内置的Ruby方法或众所周知的库可以返回对象的整个方法查找链?Ruby查看一系列令人困惑的类(如thisquestion中所讨论)以查找与消息对应的实例方法,如果没有类响应消息,则调用接收方的method_missing。我将以下代码放在一起,但我确信它遗漏了某些情况或者它是否100%正确。请指出任何缺陷并指导我找到一些更好的代码(如果存在)。defmethod_lookup_chain(obj,result=[obj.singleton_class])ifobj.instance_of?Classreturnadd_modules(result)ifresult.last==B

  6. ruby-on-rails - rails 中的路径解析 - 2

    我正在寻找这样解析路由路径的方法:ActionController::Routing.new("post_path").parse#=>{:controller=>"posts",:action=>"index"}应该和url_for相反更新我发现:Whatistheoppositeofurl_forinRails?Afunctionthattakesapathandgeneratestheinterpretedroute?ActionController::Routing::Routes.recognize_path("/posts")所以现在我需要将posts_path转换为“/p

  7. python3获取路径方法 - 2

    一:os.path.dirname(__file__)和os.getcwd()importospath=os.path.dirname(__file__)print("os.path.dirname(__file__)方法的结果{}".format(path))path=os.getcwd()print("os.getcwd()方法的结果{}".format(path))该脚本路径为:/User/xxx/Work1.在当前目录/User/xxx/Work运行程序结果:2.在上一级目录/User/xxx运行程序:3.在其他目录/User/xxx/Work/python运行程序:\在其他目录/Us

  8. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  9. ruby-on-rails - 更改回形针附件上集成测试的路径 - 2

    Paperclip的文档提到,您可以通过将以下代码放在test.rb环境文件中来更改测试的上传路径:Paperclip::Attachment.default_options[:path]="#{Rails.root}/spec/test_files/:class/:id_partition/:style.:extension"我遇到的问题是附件在模型中设置了路径,不会被覆盖:has_attached_file:photo,path:':attachment/:id/:style.:extension'当我运行测试时,文件会上传到/photo/文件夹而不是/spec/test_file

  10. ruby-on-rails - 自定义 Rails 的默认 Resourceful Route 路径 - 2

    长话短说我想更改Rails资源路由的默认行为,移动所有资源的create路径,使其成为/resources/new的POST而不是比/resources。设置让我们假设一个像这样指定的足智多谋的路线:#routes.rbresources:events实际生成的路由是:$rakeroutesPrefixVerbURIPatternController#ActioneventsGET/events(.:format)events#indexPOST/events(.:format)events#createnew_eventGET/events/new(.:format)events#n

随机推荐