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
相关产品推荐
相关产品推荐

