C正则表达式验证文件夹

时间:2018-04-15 09:42:01

标签: c regex filenames

我是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(&regex, regex_str, REG_EXTENDED | REG_ICASE);
    if (reti) {
        fprintf(stderr, "Could not compile regex\n");
        exit(1);
    }
    reti = regexec(&regex, test, 0, NULL, REG_EXTENDED | REG_ICASE);
    regfree(&regex);
    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\ /匹配。

如何检查并确保给定路径位于使用正则表达式的文件夹下?提前谢谢。

1 个答案:

答案 0 :(得分:2)

POSIX提供了一个很好的功能realpath()

  

realpath()展开所有符号链接并解析对/./的引用,   /../和以null结尾的字符串中的额外'/'字符   生成规范化绝对路径名的路径。所结果的   pathname存储为以null结尾的字符串,最多为   PATH_MAX字节,在resolved_pa​​th指向的缓冲区中。该   结果路径将没有符号链接,/。/或/../组件。

如果您可以使用它,我认为它符合您的需要,如果没有,也许您可​​以复制源代码。