c++ 使用正则匹配url

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 使用正则匹配url相关的知识,希望对你有一定的参考价值。

stl regex

     stl 中regex 非常好用,即使不用boost库也可以很轻易地且高效地摘取你想要的内容,这里提供一个class
解析出 a href 的文件名路径和文件名和文件后缀名
    另外需要解析url的朋友可以看这篇文章:
解析url的代码

代码 show me the code

/*

 author:qianbo
 date  :2014-11-06
 功能  :解析html A href 取出其中的连接,解析出全路径 文件前缀 文件后缀
*/

#include <regex>    
#include <string>    
#include <iostream>  
#include <fstream>
#include <functional>
#include <windows.h>
using namespace std;

typedef struct dataHtmlFile 
{
	string s1;         //全路径
	string filePrefix; //文件前缀 
	string fileSuffix; //带dot的文件后缀 如 .png .jpg 
}dataHtmlFile;


template <class Type>
class PrintString
{
public:
	PrintString()
	{
	}
	void operator ( ) ( Type& elem ) const
	{
		cout<<"the value is "<<elem.s1<<" "<<elem.filePrefix<<" "<<elem.fileSuffix <<endl;
		//elem *= Factor;
	}
};


class PrintString2
{
public:
	PrintString2()
	{
	}
	void operator ()(string& elem) const
	{
		cout<<"now it is "<<elem<<endl;
	}
	void print()
	{

	}
};


class DGIRegex
{
private:
  
public:
//检测是否是电话格式
	static int isPhoneNumber(string strPhone)  
	{  
		static string g_strPhone = "0\\\\d{2}-\\\\d{8}";
		std::tr1::cmatch res1;  

		std::tr1::regex rx(g_strPhone);   
		if(std::tr1::regex_search(strPhone.c_str(), res1, rx))
			return 0;
		return -1;  
	}  

//得到全路径
	static int get_exe_path(string& strPath)
	{
		char szPath[260]; 

		if( !GetModuleFileNameA(NULL, szPath, 260 ) )
		{
			return -1;
		}
		else
		{
			(strrchr(szPath,'\\\\'))[1] = 0;
			//(_tcsrchr(szPath, '\\\\'))[1] = 0;
			strPath = szPath;
			return 0;
		}
	}

protected:
	int UseIter(string& html,vector<dataHtmlFile>& links);
	int UseSearch(string& html,vector<dataHtmlFile>& links);
public:
	int RegexSearchLinkFile(string& html,int isFile,vector<dataHtmlFile>& Links);
public:
	DGIRegex(void);
	~DGIRegex(void);
};

实现

int DGIRegex::UseIter(string& html,vector<dataHtmlFile>& links)
{
	tr1::regex rxHtmlB("<A HREF=\\"([^>]+)\\">",tr1::regex::icase);  //<a[^>]+>

	tr1::sregex_token_iterator ite(html.begin(), html.end(), rxHtmlB), end;  

	tr1::regex rx("\\"([^\\"]+)\\"");

	int i = 0;
	for ( ; ite != end; ++ite)  
	{  
		string strfind = ite->str();
		//cout << ite->str() << endl;  
		tr1::cmatch res;
		if(std::tr1::regex_search(strfind.c_str(),res,rx))
		{
			//cout<<res[1]<<endl;
			//links.push_back(res[1]);
			i++;
		}
	}
	return i;
}

int DGIRegex::UseSearch(string& html,vector<dataHtmlFile>& links)
{
	tr1::smatch m;
	tr1::regex rxHtml("<A\\\\s+HREF\\\\s*=\\\\s*\\"([^>]+)\\">(\\\\w+)(\\\\.[^<]+)</A>",tr1::regex::icase);  
	string source = html;
	int i = 0;
	while (tr1::regex_search (source,m,rxHtml)) {
		//for (auto x:m) std::cout << x << " ";
		//cout<<m[0];
		//std::cout << std::endl;
		//cout<<"this is total "<<m.size()<<endl;
		dataHtmlFile dhtmlf;
		dhtmlf.s1 = m[1];
		dhtmlf.filePrefix = m[2];
		//文件后缀赋值
		dhtmlf.fileSuffix = m[3];
		links.push_back(dhtmlf);
		++i;
		source = m.suffix().str();
	}
	return i;
}



/*输入html 的字符串或者html的名字*/
int DGIRegex::RegexSearchLinkFile(string& html,int isFile,vector<dataHtmlFile>& Links)
{
	string fileContent = html;
	if(isFile == 1) //如果是文件,html是文件民称
	{
		//fstream eam(html);
		ifstream in(html.c_str(), ios::in|ios::binary);

		if(in.is_open())
		{
			string temp;
			while(getline(in,temp))
			{
				fileContent += temp;
			}
			in.close();
			return UseSearch(fileContent,Links);
		}
	}
	return UseSearch(fileContent,Links);
	
}

测试程序

int main()
{
	DGIRegex regex;
	vector<dataHtmlFile> test;
	regex.RegexSearchLinkFile(string("c:\\\\test2.html"),1,test);
	std::for_each(test.begin(), test.end(),PrintString<dataHtmlFile>());
   return 0;
}

以上是关于c++ 使用正则匹配url的主要内容,如果未能解决你的问题,请参考以下文章

python怎么做让正则只匹配输出url中的域名?

在 C++ 中有一个使用模式匹配(使用正则表达式)的函数吗?

循环通过 python 正则表达式匹配

Java中匹配URL的正则表达式

Java:怎样使用正则从url中匹配出ip和端口呢

Java 正则表达式:如何匹配 URL 路径?