c语言正则表达式抓取网站的<title>
本程序的功能是搜索网站的<title>字段的值遗憾的是并不通用:ps:我也不知道为什么失败
求思路:
问题1:正则表达式或运算消除标签大小写后匹配不到字符串
问题2:正则表达式实现零宽断言后发现匹配不到字符串
问题3:在一些网站上测试<title>成功 在其他网站可能会失败
程序代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #include <regex.h>//正则表达式 #define BUF_SIZE 512 int reptile_regex(char * buf); char ch[100000]; int main(int argc,char *argv[]) { struct sockaddr_in servAddr; struct hostent * host; int sockfd; char sendBuf[BUF_SIZE],recvBuf[BUF_SIZE]; int sendSize,recvSize; host=gethostbyname(argv[1]); if(host==NULL) { perror("dns 解析失败"); } servAddr.sin_family=AF_INET; servAddr.sin_addr=*((struct in_addr *)host->h_addr); servAddr.sin_port=htons(atoi(argv[2])); bzero(&(servAddr.sin_zero),8); sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { perror("socket 创建失败"); } if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1) { perror("connect 失败"); } //构建一个http请求 sprintf(sendBuf,"GET / HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n\r\n",argv[1]); if((sendSize=send(sockfd,sendBuf,BUF_SIZE,0))==-1) { perror("send 失败"); } //获取http应答信息 memset(recvBuf,0,sizeof(recvBuf)); memset(ch,0,sizeof(ch)); char pattern[128]={0}; while(recvSize=recv(sockfd,recvBuf,BUF_SIZE,0)>0) { //printf("%s",recvBuf); strcat(ch,recvBuf); memset(recvBuf,0,sizeof(recvBuf)); } reptile_regex(ch); return 0; } //第一个参数是要匹配的字符串,第二个参数是匹配的规则,返回匹配的个数 int reptile_regex(char* buf) { const char* pattern="<TITLE>.*<\\/TITLE>"; int cflags= REG_EXTENDED; const size_t nmatch=10;//结构体数组长度 regmatch_t pm[10];//结构体数组 存放匹配文本串的位置信息 regex_t reg;//正则表达式指针 char* str; str=buf;//str目标字符串 regcomp(®,pattern,0);//编译匹配模式 while(regexec(®,str,nmatch,pm,0)==0) { for(int j=pm[0].rm_so;j<pm[0].rm_eo;++j) { printf("%c",str[j]); } printf("\n"); str=str+pm[0].rm_eo; } regfree(®); return 0; }