雖可透過 MSHTML (IHTMLDocument2::get_links) 取得連結,但為了深入理解解析邏輯、支援特殊格式 (如 url=...、JavaScript 動態生成、相對路徑轉絕對),本文實作一個純字串分析類別 CWebHost,從 HTML 原始碼提取所有超連結 URL 與連結文字。
// 唯一公開介面:建構函式即完成分析
CWebHost(
const CString& strWebCode, // 完整 HTML 內容
vector<HyperLink>& vecURL, // 輸出:超連結結構陣列
CString& strBaseURL // 當前頁面基礎 URL (用於相對路徑轉換)
);
struct HyperLink {
CString strHyperlink; // 解析後的絕對 URL
CString strHyperlinkText; // 連結文字 (anchor text)
};
OnReturnWebContent:主流程入口,依序呼叫各解析函式。OnGetHtmlURL:解析標準 <a href="...">、<area href="...">、<link href="...">。OnGetJumpURL:解析 Meta Refresh、<meta http-equiv="refresh" content="...;url=...">。OnReturnFrameURL:遞迴解析 <frame src="...">、<iframe src="..."> 巢狀頁面。OnAnalyseJavascript:簡易掃描 <script> 區塊,提取 location.href=、window.open( 等動態 URL (已知有誤報/漏報)。OnConversionURL:將相對路徑 (../page.html、/dir/page.html、page.html) 依 strBaseURL 轉為絕對 URL。OnGetLinkText:提取 <a>文字</a> 內容,處理巢狀標籤、實體編碼 ( )。
background-image: url(...)、@import 等資源連結。Gumbo、libxml2、AngleSharp) 或直接使用 MSHTML/WebView2 取得 DOM 樹後遍歷。vector, string)
CWebHost.h/cpp // 主類別
URLStruct.h // HyperLink 結構定義
// 其餘輔助函式內含於 CWebHost.cpp