如何在c程序中使用pcre库匹配url

如何在c程序中使用pcre库匹配url,c,regex,pcre,lighttpd,C,Regex,Pcre,Lighttpd,如何匹配url/[a-z0-9]/phpmyadmin/? 如果url匹配regex=/^\/([a-z0-9])+\/phpmyadmin/g 如何将组捕获到char以便进一步操作 例如,我有这个 char *url = "/zs0099/phpmyadmin"; 我想将它与regex/^\/([a-z0-9])+\/phpmyadmin/g 如果匹配的话 char *token = "zs0099"; //(how to get this value to assigned here)

如何匹配url
/[a-z0-9]/phpmyadmin/
? 如果url匹配regex=
/^\/([a-z0-9])+\/phpmyadmin/g
如何将组捕获到char以便进一步操作

例如,我有这个

char *url = "/zs0099/phpmyadmin";
我想将它与regex
/^\/([a-z0-9])+\/phpmyadmin/g
如果匹配的话

char *token = "zs0099"; //(how to get this value to assigned here)
臀部快速射击(但无pcre),裸C(小型状态机)

#包括
#包括
#包括
int isMatch(char*url,char*p){
int state=0;
而(*url!=0){
开关(状态){
//第一个状态:字符必须为“/”
案例0:
如果(*url!='/'),则返回0;
状态=1;
url++;
打破
//只有字符和数字有效,另一个“/”结束此操作
案例1:
如果(isalpha(*url)| isdigit(*url)){*p++=*url;url++;break;}
如果(*url=='/'){url++;state=2;break;}
返回0;//非alhanum或'/'-->无效;
打破
案例2:
*p++=0;
if(strcmp(url,“phpmyadmin”)==0)返回1;
返回0;
}
}
返回0;
}
int main(){
字符部分[256];
char*x1=“/019sasA/phpmyadmin”;
int matches=isMatch(x1,部分);
printf(“%s,%i-->%s\n”,x1,匹配项,匹配项?部分:“”);
char*x2=“/019sasA/phpadmin”;
匹配=isMatch(x2,零件);
printf(“%s,%i-->%s\n”,x2,匹配项,匹配项?部分:“”);
char*x3=“/019sa,sA/phpmyadmin”;
匹配=isMatch(x3,零件);
printf(“%s,%i-->%s\n”,x3,匹配项,匹配项?部分:“”);
}
可能的问题:
“//phpmyadmin”有效(可以通过一个或多个状态轻松修复,其中第一个状态只接受isdigit()和isnumber(),不接受“/”)
“/phpmyadmin”无效

从臀部快速射击(但不带pcre),裸C(小型状态机)

#包括
#包括
#包括
int isMatch(char*url,char*p){
int state=0;
而(*url!=0){
开关(状态){
//第一个状态:字符必须为“/”
案例0:
如果(*url!='/'),则返回0;
状态=1;
url++;
打破
//只有字符和数字有效,另一个“/”结束此操作
案例1:
如果(isalpha(*url)| isdigit(*url)){*p++=*url;url++;break;}
如果(*url=='/'){url++;state=2;break;}
返回0;//非alhanum或'/'-->无效;
打破
案例2:
*p++=0;
if(strcmp(url,“phpmyadmin”)==0)返回1;
返回0;
}
}
返回0;
}
int main(){
字符部分[256];
char*x1=“/019sasA/phpmyadmin”;
int matches=isMatch(x1,部分);
printf(“%s,%i-->%s\n”,x1,匹配项,匹配项?部分:“”);
char*x2=“/019sasA/phpadmin”;
匹配=isMatch(x2,零件);
printf(“%s,%i-->%s\n”,x2,匹配项,匹配项?部分:“”);
char*x3=“/019sa,sA/phpmyadmin”;
匹配=isMatch(x3,零件);
printf(“%s,%i-->%s\n”,x3,匹配项,匹配项?部分:“”);
}
可能的问题:
“//phpmyadmin”有效(可以通过一个或多个状态轻松修复,其中第一个状态只接受isdigit()和isnumber(),不接受“/”)

“/phpmyadmin”无效

好的搜索引擎是你的朋友好的搜索引擎是你的朋友
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int isMatch( char *url, char *p ) {
    int state= 0;
    while ( *url != 0 ) {
        switch (state) {
            // first state: char must be '/'
            case 0: 
               if (*url != '/') return 0;
               state=1;
               url++;
               break;
            // only characters and numbers are valid, another '/' ends this
            case 1: 
               if (isalpha(*url) || isdigit(*url)) { *p++=*url; url++; break; }
               if (*url == '/') { url++; state=2; break; }
               return 0; // not alhanum nor '/' --> not valid;
               break;
           case 2:
               *p++=0;
               if (strcmp(url, "phpmyadmin")==0) return 1;
               return 0;
           }
   }
   return 0;
}

int main() {
    char part[256];

    char *x1 = "/019sasA/phpmyadmin";
    int matches = isMatch(x1, part);
    printf ("%s, %i --> %s \n", x1, matches , matches ? part : "");

    char *x2 = "/019sasA/phpadmin";
    matches = isMatch(x2, part);
    printf ("%s, %i --> %s \n", x2, matches , matches ? part : "");

    char *x3 = "/019sa,sA/phpmyadmin";
    matches = isMatch(x3, part);
    printf ("%s, %i --> %s \n", x3, matches , matches ? part : "");
}