检查目录路径是否以DIRECTORY_SEPARATOR结尾。

4

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

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

我的失败尝试包括尝试执行preg_match,例如:

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

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

5个回答

17

为修复您的正则表达式:

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

但是可能有更简单的方法来实现你的目标:

rtrim($path,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;

+1 很好的整洁的 rtrim 解决方案。(就像我的一样,如果 DIRECTORY_SEPARATOR 不是单个字符,它将失败,但我还没有看到会引起问题的操作系统。) - John Parker
我曾考虑过不使用 / 作为正则表达式的分隔符,但实际上,谁知道未来几年会发明出什么 DIRECTORY_SEPARATOR... - mvds
顺便提一下,这个程序不会在多字符DIRECTORY_SEPARATOR上失败,因为它会将整个分隔符切掉。(好吧,如果文件名的最后一个字符是包含在多字符DIRECTORY_SEPARATOR中的字符...但这种情况非常罕见) - mvds
是的,也许“失败”有点过了。那么怎么样用“它的行为将是未定义的”呢? :-) - John Parker
2
@mvds。鉴于这是PHP,他们会使用\\,就像在命名空间中一样,而且之前没有人使用过它...哦...等一下... - Marc B
显示剩余2条评论

1

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


这个方法可以解决问题,但我认为提问者担心目录分隔符在未来可能会发生变化。它可能不止一个字符长度,而是更多,例如“::”。 - fabjoa
1
除非世界倒退了,否则我看不出为什么世界需要在命令行上输入更多的字符。 - bcosca

0
一种简单的解决方法是使用...
$sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false;

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


substr($path,-1)$path{strlen($path) - 1}更高效。 - mvds

0

也可以使用数组访问符号

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

-1

我认为,根据平台的不同,你可能会在第一个参数上得到一个无效的正则表达式。

你的解决方案设计优雅,代码写得很好。但请记住,目录分隔符通常是特殊字符。它可能需要一些转义。

编辑 #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)) - mvds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接