我是C语言中的正则表达式的新手,我正在尝试使用regex.h
库查找给定文件名是否位于使用正则表达式的文件夹下。这就是我的尝试:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
int checkregex(char regex_str[100], char test[100]) {
regex_t regex;
printf("regex_str: %s\n\n", regex_str);
int reti = regcomp(®ex, regex_str, REG_EXTENDED | REG_ICASE);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
reti = regexec(®ex, test, 0, NULL, REG_EXTENDED | REG_ICASE);
regfree(®ex);
return reti;
}
void main(int argc, char *argv[]) {
const char *safepath = "/home";
size_t spl = strlen(safepath);
char *fn = argv[1];
int noDoubleDots = checkregex("[^..\\/]", fn);
int allowedChars = checkregex("^[[:alnum:]\\/._ -]*$", fn);
int backslashWithSpace = checkregex(".*(\\ ).*", fn);
puts("noDoubleDots");
puts((noDoubleDots == 0 ? "Match\n" : "No Match\n"));
puts("allowedChars");
puts((allowedChars == 0 ? "Match\n" : "No Match\n"));
puts("backslashWithSpace");
puts((backslashWithSpace == 0 ? "Match\n" : "No Match\n"));
return;
}
如果..
包含noDubleDots
(我甚至无法做到),我的第一次尝试就是不匹配。但后来我测试并看到文件名和文件夹名称中包含..
,例如folder..name/
。所以我想要排除/..
或../
的内容。但是,如果文件夹名称类似于folder ..
,并且其中有另一个名为folder2/
的文件夹,则路径将为folder\ ../folder2
,排除../
将导致输出错误。
在代码中,allowedChars工作正常。我想如果我还检查文件名是否有..
,\ ..
或\ ([:alnum:])*
来验证文件路径,那么它就完成了。但我的正则表达似乎没有奏效。例如,backslashWithSpace与asd /
和asd\ /
匹配。
如何检查并确保给定路径位于使用正则表达式的文件夹下?提前谢谢。
答案 0 :(得分:2)
POSIX提供了一个很好的功能realpath()
realpath()展开所有符号链接并解析对/./的引用, /../和以null结尾的字符串中的额外'/'字符 生成规范化绝对路径名的路径。所结果的 pathname存储为以null结尾的字符串,最多为 PATH_MAX字节,在resolved_path指向的缓冲区中。该 结果路径将没有符号链接,/。/或/../组件。
如果您可以使用它,我认为它符合您的需要,如果没有,也许您可以复制源代码。