【问题标题】:PHP: a good way to universalize paths across OSs (slash directions)PHP:一种跨操作系统通用化路径的好方法(斜线方向)
【发布时间】:2011-08-04 07:23:31
【问题描述】:

我最关心的是能够处理跨操作系统的路径,主要是关于目录分隔符的反斜杠和正斜杠。

我使用的是DIRECTORY_SEPARATOR,但是:

  1. 写得很长

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

我目前正在使用:

    function pth($path)
    {
        $runningOnWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
        $slash = $runningOnWindows ? '\\' : '/';
        $wrongSlash = $runningOnWindows ? '/' : '\\' ;
        return (str_replace($wrongSlash, $slash, $path));
    }

只是想知道我正在重新发明的语言中没有任何东西,

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

【问题讨论】:

  • 有一个DIRECTORY_SEPARATOR 常量保存当前操作系统的分隔符。它将对您有所帮助,因为您无需查看runningOnWindows。你只需要让你的函数转换各种斜线除了DIRECTORY_SEPARATOR中定义的那个

标签: php path operating-system


【解决方案1】:

您缺少DIRECTORY_SEPARATOR 预定义常量。

【讨论】:

  • 好吧,这还不够他想做的(构建一个通用方法将any路径转换为当前操作系统的格式)。但这是一个开始
  • @Pekka:当然。但他可能会丢失自定义操作系统检测,恕我直言,这是该代码中最令人不快的事情。
【解决方案2】:

我知道 DIRECTORY_SEPARATOR,

不过:1.写的比较长

懒惰永远不是任何事情的理由

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

$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);

这将在一步中将“正确的”替换为自身,但这没有任何区别。

如果您确定存在路径,则可以使用realpath()

$path = realpath($path);

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

【讨论】:

  • 见鬼,你甚至可以在 Windows 上混合斜线。 'C:\Foo\Bar/baz/what.php' 在 PHP 中是完全合法的路径。
  • 呵呵,是啊,真的没有理由去想这个。据我所知,只有一个例外,它对胜利有影响php.net/domdocument.load 那里也提到了解决方案;)
  • “你甚至可以在 Windows 上混合斜线”。这是一个在 Windows 上不起作用的示例: exec("rd path\with/mixed/slashes") 将 / 视为命令的键
  • 我不知道windows上的每一个陷阱,但这个主题是关于php中的一个解决方案,通过exec()执行的命令与php没有太大关系。
【解决方案3】:

据我所知,如果您要将这些路径传递给标准 PHP 函数,则实际上不需要修复路径。 file_get_contentsfopen 之类的基本函数可以在任何类型的路径上完美运行。

【讨论】:

    【解决方案4】:
      static function fx_slsh($path) {
        $path = str_replace(['/','\\'], DIRECTORY_SEPARATOR, $path);
        return substr($path, -1) == DIRECTORY_SEPARATOR ? $path : $path . DIRECTORY_SEPARATOR;
      }
    

    这也将确保有一个斜杠

    【讨论】:

    • Linux 很高兴在访问目录时看到尾随 /,但我不确定 Windows 是否会喜欢。
    • fx_slsh($path) ?在这个经济中元音太贵了吗? fix_slash($path)
    【解决方案5】:

    您可以简单地将所有内容更改为正斜杠/。完全摆脱反斜杠\。正斜杠适用于所有操作系统,包括 Windows。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2010-09-05
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多