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

如何通过REGEX避免提交错误URL时误删根目录

问题:用正则实现校验函数防止误删根目录

我开发了一款应用,会在目录中搜索所需文件,使用后将其删除。问题在于,有时因用户取消提交,会得到不包含子目录的路径,进而导致根目录被删除。我的应用会在提交时重建缺失的根目录,但我希望提前设置防护措施避免该问题。

如下示例中,最后3种情况会删除根目录:

$delete[] = "c:\\temp/root/abcdefg";
$delete[] = "c:\\temp/root\\zsyrefg";
$delete[] = "c:\\temp/root/";
$delete[] = "c:\\temp/root\\";
$delete[] = "c:\\temp/root";

foreach ($delete as $dir) {
     if ($dir!= check_function($root))
         removeDirectory($dir);
}

我试过用字符串处理,但方法比较粗糙,想使用正则来实现这个check_function(),能否有人帮忙完成?


解决方案:基于正则的校验函数实现

这里可以实现一个适配系统目录分隔符的正则校验函数,精准识别根目录本身(包括末尾带斜杠的情况):

function check_function($root) {
    // 统一根目录的分隔符,转义正则特殊字符
    $standardRoot = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $root);
    $escapedRoot = preg_quote($standardRoot, '/');
    
    // 正则规则:匹配根目录本身,允许末尾带一个目录分隔符
    $pattern = '/^' . $escapedRoot . '(?:\\' . DIRECTORY_SEPARATOR . ')?$/';

    return function($dir) use ($pattern) {
        // 统一待校验路径的分隔符
        $standardDir = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $dir);
        // 判断是否为根目录
        return preg_match($pattern, $standardDir) ? $dir : false;
    };
}

关键逻辑说明

  • 路径标准化:把混合使用/和\的路径统一为系统默认的DIRECTORY_SEPARATOR,避免跨平台或格式不统一导致的匹配失败。
  • 正则匹配规则:
    • ^和$确保匹配整个路径字符串,避免部分匹配(比如子目录包含根目录名称的情况)。
    • (?:\\' . DIRECTORY_SEPARATOR . ')?是可选的末尾分隔符,兼容根目录带/不带最后一个斜杠的两种写法。
    • preg_quote()转义根目录中的特殊字符(如冒号、空格),防止正则语法错误。

调整后的调用方式

原代码的判断逻辑需要适配闭包返回值,示例如下:

$root = "c:\\temp/root";
$isRoot = check_function($root);

foreach ($delete as $dir) {
    if (!$isRoot($dir)) {
        // 非根目录,执行删除
        // removeDirectory($dir);
        echo "执行删除:{$dir}\n";
    } else {
        // 根目录,跳过删除
        echo "跳过根目录:{$dir}\n";
    }
}

测试输出结果

针对示例中的5个路径,执行后会输出:

执行删除:c:\temp/root/abcdefg
执行删除:c:\temp/root\zsyrefg
跳过根目录:c:\temp/root/
跳过根目录:c:\temp/root\
跳过根目录:c:\temp/root

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:45:29