c++使用libpcre

我还是不太习惯使用regex,习惯使用pcre标准的正则库
先放上代码

#include "pcre.h"  
#include <stdio.h>  
#include <string.h>  

#define OVECCOUNT 256

int main(int argc, char ** argv)  
{  
    char pText[1024] = "<div class=\"main-wrap J_TRegion\" data-modules=\"main\" style=\"overflow:visible;\" data-width=\"b950\"><div class=\"J_TModule\" data-widgetid=\"14777518346\"  id=\"shop14777518346\"  data-componentid=\"4011\"  data-spm='110.0.4011-14777518346'  microscope-data='4011-14777518346' data-title=\"搜索列表\"  >                        <div class=\"skin-box tb-module tshop-pbsm tshop-pbsm-tmall-srch-list\" id=\"TmshopSrchNav\"><!-- /search.htm    --><input id=\"J_ShopAsynSearchURL\" type=\"hidden\" value=\"/i/asynSearch.htm?mid=w-14777518346-0&wid=14777518346&path=/search.htm&&amp;search=y&amp;orderType=newOn_desc&amp;tsearch=y&amp;pageNo=2\" />";  

    //const char * pPattern = "(\\d+)\\w+";
    const char *pPattern="<input id=\"J_ShopAsynSearchURL\" type=\"hidden\" value=\"([^\"]+)\"";
    const char * pErrMsg = NULL;  
    pcre * pPcre = NULL;  
    int nOffset = -1;   

    pPcre = pcre_compile(pPattern, 0, &pErrMsg, &nOffset, NULL);
    if(pPcre == NULL){
        printf("pcre match error\n");
        return 1;
    }
    int ovector[OVECCOUNT];
    int matchFlag;
    matchFlag = pcre_exec(pPcre, NULL, pText, strlen(pText),0,0, ovector, OVECCOUNT);
    if(matchFlag < 0){
        if(matchFlag == PCRE_ERROR_NOMATCH){
            printf("not match\n");
        }else {
            printf("match error\n");
        }
        free(pPcre);
        return 1;
    }
    printf(" match result :\n");
    if( matchFlag > 0){
        printf("Pattern_CM: \"%s\"\n", pPattern);
        printf("String : %s\n", pText);
        printf("matchFlag=%d\n",matchFlag);

    }

    int i;
    for(int i=0;i<matchFlag;i++){
        char *strStart = pText+ovector[2*i];
        int substrLen = ovector[2*i+1] - ovector[2*i];
        printf("$%2d: %.*s\n", i, substrLen, strStart);
    }
    return 0;
}  

函数详细说明
1.pcre_compile
函数原型:
pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr)
功能:将一个正则表达式编译成一个内部表示,在匹配多个字符串时,可以加速匹配。其同pcre_compile2功能一样只是缺少一个参数errorcodeptr。
参数说明:
pattern 正则表达式
options 为0,或者其他参数选项
errptr 出错消息
erroffset 出错位置
tableptr 指向一个字符数组的指针,可以设置为空NULL。
2. pcre_compile2
函数原型:
pcre *pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errptr, int *erroffset, const unsigned char *tableptr)
功能:将一个正则表达式编译成一个内部表示,在匹配多个字符串时,可以加速匹配。其同pcre_compile功能一样只是多一个参数errorcodeptr。
参数:
pattern 正则表达式
options 为0,或者其他参数选项
errorcodeptr 存放出错码
errptr 出错消息
erroffset 出错位置
tableptr 指向一个字符数组的指针,可以设置为空NULL。
3. pcre_exec
函数原型:
int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize)
功能:使用编译好的模式进行匹配,采用与Perl相似的算法,返回匹配串的偏移位置。
参数:
code 编译好的模式
extra 指向一个pcre_extra结构体,可以为NULL
subject 需要匹配的字符串
length 匹配的字符串长度(Byte)
startoffset 匹配的开始位置
options 选项位
ovector 指向一个结果的整型数组
ovecsize 数组大小。

好的,我可以为您提供一些关于使用C++在Linux上实现网络爬虫的基本信息。 网络爬虫的核心是网络通信和HTML解析,因此我们需要使用一些C++的库来完成这些任务。以下是一些常用的库: 1. libcurl:用于HTTP请求和文件传输 2. libxml2:用于XML和HTML解析 3. libtidy:用于HTML格式化和修复 4. libpcre:用于正则表达式匹配 在使用这些库之前,您需要先安装它们。在Debian/Ubuntu系统上,您可以通过以下命令安装它们: ``` sudo apt-get install libcurl4-openssl-dev libxml2-dev libtidy-dev libpcre3-dev ``` 接下来,您需要编写一些代码来实现网络爬虫的功能。以下是一个简单的示例程序,它使用libcurl和libxml2库获取一个网页,解析它,并打印出所有的链接: ```cpp #include <curl/curl.h> #include <libxml/HTMLparser.h> size_t write_callback(char* ptr, size_t size, size_t nmemb, void* userdata) { // 该函数将被libcurl调用,用于处理HTTP响应 // 这里我们只是将响应写入一个字符串 std::string& response = *(std::string*)userdata; response.append(ptr, size * nmemb); return size * nmemb; } int main() { // 初始化libcurl curl_global_init(CURL_GLOBAL_ALL); // 创建一个libcurl句柄 CURL* curl = curl_easy_init(); // 设置请求的URL curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com"); // 设置响应处理函数 std::string response; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // 执行HTTP请求 CURLcode res = curl_easy_perform(curl); // 如果请求成功,则解析响应 if (res == CURLE_OK) { htmlDocPtr doc = htmlReadDoc((xmlChar*)response.c_str(), NULL, NULL, HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); if (doc != NULL) { xmlNodePtr cur = xmlDocGetRootElement(doc); if (cur != NULL) { cur = cur->xmlChildrenNode; while (cur != NULL) { if (xmlStrcmp(cur->name, (const xmlChar*)"a") == 0) { xmlChar* href = xmlGetProp(cur, (const xmlChar*)"href"); if (href != NULL) { printf("%s\n", href); xmlFree(href); } } cur = cur->next; } } xmlFreeDoc(doc); } } // 清理libcurl句柄和全局状态 curl_easy_cleanup(curl); curl_global_cleanup(); return 0; } ``` 上面的代码使用libcurl库执行HTTP请求,将响应写入一个字符串中,然后使用libxml2库解析HTML响应,并打印出所有链接。 当然,这只是一个简单的示例程序,实际的网络爬虫需要更复杂的代码来处理各种情况,如HTTP响应码、重定向、cookie等。但是,以上代码可以为您提供一个快速入门的起点。 希望这可以帮助您开始编写C++网络爬虫的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值