【问题标题】:Check if directory path ends with DIRECTORY_SEPARATOR检查目录路径是否以 DIRECTORY_SEPARATOR 结尾
【发布时间】:2011-03-24 18:21:02
【问题描述】:

在 PHP 中,我从用户那里收到一个字符串,用于本地文件目录 $path

我想知道它们是否包含尾部斜杠 (/)。我希望这是跨平台的,所以我想使用 PHP 常量 DIRECTORY_SEPARATOR

我失败的尝试包括尝试进行类似的 preg_match

preg_match("/" . DIRECTORY_SEPARATOR . "$/", $path);

我基本上只是想要一种优雅的方式来测试字符串是否以 DIRECTORY_SEPARATOR 结尾。

【问题讨论】:

    标签: php directory filesystems user-input


    【解决方案1】:

    修复你的正则表达式:

    preg_match("/" . preg_quote(DIRECTORY_SEPARATOR) . "$/", $path);
    

    但可能有更简单的方法可以实现您的目标:

    rtrim($path,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
    

    【讨论】:

    • +1 不错的 rtrim 解决方案。 (就像我的一样,如果 DIRECTORY_SEPARATOR 不是单个字符,它会失败,但我还没有看到会导致问题的操作系统。)
    • 我在考虑不使用/ 作为正则表达式分隔符,但事实上,谁知道未来几年可能会发明什么 DIRECTORY_SEPARATOR...
    • 顺便说一句,这在多字符 DIRECTORY_SEPARATOR 上不会失败,因为它会切掉整个分隔符。 (好吧,好吧,如果文件名的最后一个字符是包含在多字符 DIRECTORY_SEPARATOR 中的字符......但这会很模糊)
    • 没错,也许“失败”有点过分。 “它的行为将是未定义的”怎么样。 :-)
    • @mvds。鉴于它是 PHP,他们会使用 `\`,就像在命名空间中一样,之前没有人使用过它......哦......等一下......
    【解决方案2】:

    简单的substr($path,-1)==DIRECTORY_SEPARATOR 有什么问题?

    【讨论】:

    • 它可以解决问题,但我再次认为提问者担心目录分隔符将来可能会改变。它的长度可能不超过一个字符,但更多,即::
    • 除非世界在倒退,否则我认为世界没有理由要求在命令行上输入更多字符
    【解决方案3】:

    解决这个问题的一种简单方法是使用...

    $sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false;
    

    ...这将比正则表达式更有效。再说一次,如果 DIRECTORY_SEPARATOR 不是单个字符,这将失败。

    【讨论】:

    • substr($path,-1) 反过来会比$path{strlen($path) - 1} 更有效率
    【解决方案4】:

    也可以使用数组访问表示法

    $endsInDS = $str[strlen($str)-1] === DIRECTORY_SEPARATOR;
    

    【讨论】:

      【解决方案5】:

      我认为根据平台的不同,您最终可能会在第一个参数上使用无效的正则表达式。

      您的解决方案在每个设计上都很优雅。不错的编码。但请记住,目录分隔符通常是特殊字符。它可能需要转义。

      编辑 #1 我喜欢建议的解决方案

      $sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false;
      

      为了解决这个问题,我建议:

      $sepPresent = $path{strlen($path) - strlen(DIRECTORY_SEPARATOR)} === DIRECTORY_SEPARATOR ? true : false;
      

      【讨论】:

      • 这不适用于多字符,因为$path{..} 仅获得 1 个字符。更好地使用substr($path,-strlen(DIRECTORY_SEPARATOR))
      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 2021-11-06
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多