Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查目录路径是否以目录分隔符结尾_Php_Directory_Filesystems_User Input - Fatal编程技术网

Php 检查目录路径是否以目录分隔符结尾

Php 检查目录路径是否以目录分隔符结尾,php,directory,filesystems,user-input,Php,Directory,Filesystems,User Input,在PHP中,我从用户那里收到一个本地文件目录$path 我想知道他们是否包含尾部斜杠(/)。我希望这是跨平台的,所以我希望使用PHP常量目录\u分隔符 我失败的尝试包括试着做一场预赛,比如 preg_match("/" . DIRECTORY_SEPARATOR . "$/", $path); 我基本上只想用一种优雅的方法来测试字符串是否以目录分隔符结尾,以修复您的regexp: preg_match("/" . preg_quote(DIRECTORY_SEPARATOR) . "$/",

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

我想知道他们是否包含尾部斜杠(/)。我希望这是跨平台的,所以我希望使用PHP常量
目录\u分隔符

我失败的尝试包括试着做一场预赛,比如

preg_match("/" . DIRECTORY_SEPARATOR . "$/", $path);
我基本上只想用一种优雅的方法来测试字符串是否以
目录分隔符结尾,以修复您的regexp:

preg_match("/" . preg_quote(DIRECTORY_SEPARATOR) . "$/", $path);
但实现目标可能有更简单的方法:

rtrim($path,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;

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

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

…这将比正则表达式更有效。同样,如果目录分隔符不是单个字符,则此操作将失败。

我认为,根据平台的不同,第一个参数上可能会出现无效的正则表达式

您的解决方案是优雅的每一个设计。很好的编码。但请记住,目录分隔符通常是特殊字符。它可能需要一些逃逸

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

$sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false;
为了解决这个问题,我建议:

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

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

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

简单的
substr($path,-1)=目录分隔符有什么问题?

+1漂亮整洁的rtrim解决方案。(就像我的一样,如果目录分隔符不是单个字符,它将失败,但我还没有看到会导致问题的操作系统。)我考虑不使用
/
作为regexp分隔符,但事实上,谁知道未来几年可能会发明什么目录分隔符…顺便说一句,这不会在多字符目录分隔符上失败,因为它会将整个分离器切碎。(好吧,好吧,如果文件名的最后一个字符是包含在多字符目录_分隔符中的字符……但这将非常模糊)是真的,也许“fail”有点过分。“它的行为将是未定义的”怎么样@MVD。如果是PHP,他们会使用“\”,就像在名称空间中一样,而且以前没有人使用过它。。。哦等一下…
substr($path,-1)
反过来会比
$path{strlen($path)-1}
更有效,这会起到作用,但我想asker再次担心目录分隔符将来可能会改变。它的长度可能不超过一个字符,而是更多,即::除非世界正在向后移动,否则我认为没有理由要求世界在命令行上键入更多字符这对多字符不起作用,因为
$path{..}
仅获取1个字符。最好使用substr($path,-strlen(目录分隔符))