⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlparser.cpp

📁 Visual C++ 网络通信编程实用案例精选 的配套光盘
💻 CPP
字号:
#include "stdafx.h"
#include "stdlib.h"

#include "HTMLParser.h"

CHtmlParser::CHtmlParser()
{
}

CHtmlParser::~CHtmlParser()
{
}

// 在buffer里找出预定义的标号,设置标号位置的索引
BOOL CHtmlParser::FindToken(const char *pTokens, const char *pBuffer, int& nIndex, int nMaxLen)
{
	int nTokenCount = strlen(pTokens);
	BOOL bQuote = FALSE;

	while(nIndex < nMaxLen)
	{
		for(int i = 0; i < nTokenCount; i++)
		{
			if(pBuffer[nIndex] == pTokens[i])
				return(TRUE);
		}
		nIndex++;
	}
	return(FALSE);
}

// 返回一个特定的字符结尾的字符串,设置索引的位置在字符串的尾部
CString CHtmlParser::GetString(const char *pTerminals, const char *pBuffer,int &nIndex, int nMaxLen)
{
	int nOldIndex = nIndex;
	CString strText;

	while(nIndex < nMaxLen && pBuffer[nIndex] == ' ')
		nIndex++;

	if(FindToken(pTerminals,pBuffer,nIndex,nMaxLen))
	{
		nIndex++;
		strText = pBuffer+nOldIndex;
		strText = strText.Left(nIndex-nOldIndex-1);
	}
	return(strText);
}

//得到参数名称
CString CHtmlParser::SaveParm(const CString& strParm, BOOL bLowercase)
{
	int nLen = strParm.GetLength();
	CString strNewParm = strParm;

	// 参数含有引号的地方用空格代替
	for(int i = 0; i < nLen; i++)
	{
		if(strNewParm[i] == '"')
			strNewParm.SetAt(i,' ');
	}

	// 删除前导和后驱的空格
	strNewParm.TrimLeft();
	strNewParm.TrimRight();

	if(bLowercase)
		strNewParm.MakeLower();

	return(strNewParm);
}

// 得到一个参数的配置信息
void CHtmlParser::GetOptions(const char *pBuffer, int &nIndex, int nMaxLen)
{
	CString strParm;
	int nStart;

	while(nIndex < nMaxLen)
	{
		nStart = nIndex;

		// 找出等号左边的字符串,以index为界定线
		strParm = GetString("=",pBuffer,nIndex,nMaxLen);

		if(!strParm.IsEmpty())
		{
			COptions opt;
			int nStart = nIndex;

			opt.SetParm(SaveParm(strParm,TRUE));

			while(nIndex < nMaxLen && pBuffer[nIndex] == ' ')
				nIndex++;

			//寻找html的tag的结束位置
			if(FindToken("\" >",pBuffer,nIndex,nMaxLen))
			{
				// 处理引号参数
				if(pBuffer[nIndex] == '"')
					FindToken("\"",pBuffer,++nIndex,nMaxLen);

				// 保存options的位置
				strParm = pBuffer+nStart;
				strParm = strParm.Left(nIndex-nStart);
				opt.SetValue(SaveParm(strParm,FALSE));
				opt.SetIndex(nStart);
			}

			// 往option集合中添加option
			m_arrOptions.Add(opt);

		}
		else 
			break;
	}
}

// 分析html的tag
BOOL CHtmlParser::GetTag(const char *pBuffer, int& nIndex, int nMaxLen)
{
	m_strTag.Empty();
	m_arrOptions.RemoveAll();

	// 找出tag的起始位置即"<"的位置
	if(FindToken("<",pBuffer,nIndex,nMaxLen))
	{
		int nStart = nIndex+1;
		BOOL bFound = FALSE;

		nIndex++;

		// 不是有效的tag,可能是注释也可能是html文件错误
		if(pBuffer[nIndex] == ' ' || pBuffer[nIndex] == '>' || pBuffer[nIndex] == '!')
			return FALSE;

		// 找出tag的终止位置,即">"的位置
		if(FindToken(">",pBuffer,nIndex,nMaxLen))
		{
			m_strTag = GetString(" >\r\n",pBuffer,nStart,nMaxLen);
			m_strTag.MakeLower();

			// 判断tag是否是预定义的tag
			if(WantTag(m_strTag))
			{
				nStart--;
				GetOptions(pBuffer,nStart,nIndex+1);
			}
			return TRUE;
		}
	}

	return FALSE;
}

// 缺省返回true
BOOL CHtmlParser::WantTag(const CString& strTag)
{
   return(TRUE);
}

// 缺省返回true
BOOL CHtmlParser::ProcessTag(const CString& strTag, int nIndex, 
											const HTML_ARGS& arrOptions)
{
   return(TRUE);
}

// 综合上面的函数分析html文件的tag
void CHtmlParser::ParseText(char *pBuffer, int nMaxLen)
{
	int nIndex = 0;

	m_strTag.Empty();
	m_arrOptions.RemoveAll();
	m_pRawBuffer = pBuffer;

	while(nIndex < nMaxLen)
	{
		if(GetTag(pBuffer,nIndex,nMaxLen))
		{
			if(!ProcessTag(m_strTag,nIndex,m_arrOptions))
				break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -