You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何判断当前是否处于指定目录或其子目录

解决思路:匹配目录前缀而非精确相等

原来的代码只能精确匹配COURSES_DIR本身,要覆盖所有子目录,核心思路是检查当前目录路径是否以COURSES_DIR为前缀,同时要处理路径结尾斜杠的一致性问题,避免因为多一个或少一个斜杠导致匹配失败。

方法1:PHP 8.0+ 推荐方案(使用str_starts_with)

PHP 8.0新增了str_starts_with函数,直接用来判断字符串开头非常直观:

// 统一路径格式:去掉所有路径结尾的斜杠,避免匹配歧义
$current_path = rtrim(dirname($_SERVER['PHP_SELF']), '/');
$courses_base = rtrim(COURSES_DIR, '/');

// 两种情况:要么是COURSES_DIR本身,要么是它的子目录(前缀匹配+斜杠分隔)
if ($current_path === $courses_base || str_starts_with($current_path, $courses_base . '/')) {
    // 这里写你的业务逻辑
}

方法2:兼容PHP 7.x及更低版本(使用substr)

如果你的项目还在使用PHP 8.0以下的版本,可以用substr手动做前缀匹配:

$current_path = rtrim(dirname($_SERVER['PHP_SELF']), '/');
$courses_base = rtrim(COURSES_DIR, '/');

$base_length = strlen($courses_base);
// 判断逻辑:要么完全相等,要么当前路径更长且前缀是"COURSES_DIR/"
if ($current_path === $courses_base || 
    (strlen($current_path) > $base_length && substr($current_path, 0, $base_length + 1) === $courses_base . '/')) {
    // 业务逻辑代码
}

关键细节说明

  • 为什么要处理结尾斜杠?比如如果COURSES_DIR定义为/courses/,而dirname($_SERVER['PHP_SELF'])返回/courses,精确匹配就会失败,用rtrim统一去掉结尾斜杠后就能避免这种问题。
  • 为什么要加/在前缀后面?比如如果有一个目录叫/coursesXYZ,直接匹配前缀/courses会误判,加上/就能确保是/courses的子目录而非同名前缀的其他目录。

内容的提问来源于stack exchange,提问作者gtilflm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:29:40