使用正则表达式解析URL参数

时间:2015-07-10 16:06:13

标签: c regex json apache http

我正在尝试使用正则表达式解析url参数。

这是我的网址:

http://127.0.0.1/privet/register?action=cancel&user=xx.gcp234@gmail.com

虽然很简单,但有人可以协助我为以下URL参数编写正则表达式:

action=cancel&user=xx.gcp234%40gmail.com

这是我的正则表达式:     " / ^([\ A-Z .-])\ =([\ A-Z .-])$ /

我只需要打印以下信息:

动作=取消

user = xx.gcp234@gmail.com

并将其作为JSON格式的字符串发回。

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:2)

使用Unix Linux Forums使用regex.h库(在unix中提供)从Corona688发布的帖子中获取并返回=之后由&分隔的参数的咬合位置。如果您不使用Unix,则必须查找并下载正则表达式库。

#include <stdio.h>
#include <regex.h>
int main(void)
{
        regex_t reg;
        const char *regex="([^=&?]+)=([^&]+)";
        const char *str="http://127.0.0.1/privet/register?action=cancel&user=xx.gcp234@gmail.com";
        regmatch_t matches[16];

        regcomp(&reg, regex, REG_EXTENDED);

        if(regexec(&reg, str, 16, matches, 0) == 0)
        {
                printf("regex /%s/ matched string '%s' at bytes %d-%d\n",
                        regex, str, matches[0].rm_so, matches[0].rm_eo);
        }
        else
                printf("regex /%s/ does not match string '%s'\n", regex, str);
}

答案 1 :(得分:0)

以下代码段解析网址

http://127.0.0.1/privet/register?action=cancel&user=xx.gcp234@gmail.com

    regex_t reg;
            const char *regex = "([^=&?]+)=([^&]+)";
            //const char *regex = "action=(\w*)&user=(\S*)";
            const char *str = "http://127.0.0.1/privet/register?action=cancel&user=xx.gcp234@gmail.com";
            LOGDEBUG("r->uri : %s\n", r->unparsed_uri);
            size_t maxGroups = 10;
            regmatch_t groupArray[maxGroups];

            regcomp(&reg, regex, REG_EXTENDED);

            if (regexec(&reg, str, maxGroups, groupArray, 0) == 0) {
                unsigned int g = 0;
                for (g = 0; g < maxGroups; g++) {
                    if (groupArray[g].rm_so == (size_t) -1)
                        break;  // No more groups

                    char sourceCopy[strlen(str) + 1];
                    strcpy(sourceCopy, str);
                    sourceCopy[groupArray[g].rm_eo] = 0;
                    LOGDEBUG("Group %u: [%2u-%2u]: %s\n", g, groupArray[g].rm_so,
                            groupArray[g].rm_eo, sourceCopy + groupArray[g].rm_so);

}

返回匹配的组。