// greta库的使用: 正则表达提取超链接地址 // #include "stdafx.h" #include "net.h" #include "regexpr2.h" using namespace std; using namespace regex; //unsigned int get_href(const char * pstr, char *out); //void get_full_href(const char *localhref, string &href); //以正则表达式“<a(.*?)href=(.*?)>(.*?)</a>”提取超链接时用到得函数 unsigned int get_href(const char * pstr, char *out) { unsigned int n=0; bool bstart=false; while(*pstr) { if (!bstart) { if ( *pstr=='/"' || *pstr==' ' || *pstr=='/'') { pstr++; continue; }else{ out[n]=char(*pstr); n++; bstart=true; } }else{ if ( *pstr=='/"' || *pstr==' ' || *pstr=='/'') { break; }else{ out[n]=char(*pstr); n++; } } pstr++; } out[n]=0; return n; } //以当前文档目录为基址,获取当前文档内相对地址的完整地址 //localhref 当前文档 //href 相对地址 //执行后 href 是一个完整地址 void get_full_href(const char *localhref, string &href) { string szroot=localhref; string::size_type p1 = szroot.rfind("/"); string::size_type p2 = szroot.rfind("."); if (p2 && p2>p1) { szroot=szroot.substr(0,p1); } if (href[0]=='/') { href=szroot+href; }else if (href.substr(0,5)!="http:"){ href=szroot+"/"+href; } } //正则表达式搜索匹配模式 #define DEF_REGEX_FLAGS GLOBAL | ALLBACKREFS | NOCASE | MULTILINE void main() { ByteBuffer bytes; string url; url="http://www.baidu.com/s?wd="; url+=urlencode("小说 星戒 章节 列表"); url+="&pn=0"; //<a(.*?)href=/"(.*?)/"(.*?)>(.*?)</a> //此表达式来自php,缺点不能采集到没有引号的地址 //因此使用下面的表达式,不过采集的到得第2个字表达式内容需要使用get_href进一步处理 rpattern HyperLink("<a(.*?)href=(.*?)>(.*?)</a>", DEF_REGEX_FLAGS); char path[1024]; BOOL bHtmlText; //返回的内容是否html或者text文本 BOOL bUTF8; //是否UTF8编码,如果是UTF8需要转换后在处理 if (GetUrlData(url.c_str(),bytes,bHtmlText,bUTF8) && bytes.getLength() && bHtmlText) { string bstr=bytes.c_str(); match_results sitelist; match_results::backref_type br = HyperLink.match( bstr, sitelist ); match_results::backref_vector vsites = sitelist.all_backrefs(); if( br.matched ) { for (int i=0;i<vsites.size();i+=4) { if ( get_href(vsites[i+2].str().c_str(),path) ) { if ( strstr(path,"baidu.com")==0 && strnicmp(path,"http:",5)==0 ) { //显示百度搜索结果的地址及标题 TRACE("%s %s", path, vsites[i+3].str().c_str()); } } } } } }