如何通过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
相关产品推荐
相关产品推荐

