PHP:跨OSs通用路径的好方法(斜线方向)

PHP:跨OSs通用路径的好方法(斜线方向),php,path,operating-system,Php,Path,Operating System,我最关心的是能够处理OSs中的路径,主要是在目录分隔符的前后斜杠方面 我使用的是目录分隔符,但是: 写起来很长 路径可能来自不同的来源,不一定由您控制 我目前正在使用: function pth($path) { $runningOnWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); $slash = $runningOnWindows ? '\\' : '/'; $wro

我最关心的是能够处理OSs中的路径,主要是在目录分隔符的前后斜杠方面

我使用的是
目录分隔符
,但是:

  • 写起来很长

  • 路径可能来自不同的来源,不一定由您控制

  • 我目前正在使用:

        function pth($path)
        {
            $runningOnWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
            $slash = $runningOnWindows ? '\\' : '/';
            $wrongSlash = $runningOnWindows ? '/' : '\\' ;
            return (str_replace($wrongSlash, $slash, $path));
        }
    
    我只是想知道我正在重新创造的语言中没有任何东西

    是否已经有内置的PHP函数来执行此操作

    您缺少预定义的常量

    我知道目录分隔符

    但是:1。写起来很长

    懒惰从来不是任何事情的理由

    $path = (DIRECTORY_SEPARATOR === '\\')
          ? str_replace('/', '\\', $subject)
          : str_replace('\\', '/', $subject);
    

    这将在一个步骤中取代“正确的一个”本身,但这没有任何区别

    如果您确实知道存在路径,则可以使用


    但是,这根本不是必需的,因为每个操作系统都将正斜杠
    /
    理解为有效的目录分隔符(即使是windows)。

    如果要将这些路径传递给标准PHP函数,就我所知,实际上不需要修复路径。像
    file\u get\u contents
    fopen
    这样的基本函数在您向它们抛出的任何路径上都可以正常工作

      static function fx_slsh($path) {
        $path = str_replace(['/','\\'], DIRECTORY_SEPARATOR, $path);
        return substr($path, -1) == DIRECTORY_SEPARATOR ? $path : $path . DIRECTORY_SEPARATOR;
      }
    

    这一个也将确保有一个尾随斜杠

    有一个保存当前操作系统分隔符的
    目录分隔符
    常量。它将帮助您,因为您不需要检查
    runningOnWindows
    。你只需要让你的函数转换所有类型的斜杠,除了在
    目录中定义的斜杠
    那么,这对于他想要做的是不够的(构建一个通用方法来将任何路径转换为当前操作系统的格式)。但这是一个错误start@Pekka:当然可以。但是他可能会丢失自定义操作系统检测,这是代码中最令人不快的事情。见鬼,你甚至可以在Windows上混合使用斜杠<代码>'C:\Foo\Bar/baz/what.php'在php中完全是一条合法的路径。呵呵,是的,真的没有理由去想这个。据我所知,只有一个例外,即它对win产生了影响,这里也提到了解决方案;)“你甚至可以在Windows上混合斜杠”。下面是一个在windows上不起作用的例子:exec(“rd path\with/mixed/slashes”)将/视为命令的键我不知道windows上的每个陷阱,但本主题是关于php的解决方案,通过
    exec()
    执行的命令与php没有多大关系。@KingCrunch,你在文章中引用了他的话“懒惰从来不是任何事情的原因”,但他明确指出“路径可能来自不同的来源,不一定由您控制”是原因。Linux很高兴在访问目录时看到拖尾的
    /
    ,但我不确定Windows是否会喜欢。
    $path = realpath($path);
    
      static function fx_slsh($path) {
        $path = str_replace(['/','\\'], DIRECTORY_SEPARATOR, $path);
        return substr($path, -1) == DIRECTORY_SEPARATOR ? $path : $path . DIRECTORY_SEPARATOR;
      }