首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 正則表達式提取網頁超連結:Link 與 Text 完整解析

     編輯:關於C語言

需求場景

網頁爬蟲、內容分析、SEO 檢測等場景常需從 HTML 中提取超連結的 href 屬性(Link)與連結文字(Text)。使用 Regex 是輕量級的解析方案。

核心正則表達式

string pattern = @"<a[^>]*href=(""(?<href>[^""]*)""|'(?<href>[^']*)'|(?<href>[^\s>]*))[^>]*>(?<text>.*?)</a>";

模式解析:

  • <a[^>]*:匹配 <a 開始,後接任意非 > 字元
  • href=:匹配 href 屬性
  • ("(?<href>[^""]*)"|'(?<href>[^']*)'|(?<href>[^\s>]*)):三種引號格式支援
    • 雙引號:"(?<href>[^""]*)"
    • 單引號:'(?<href>[^']*)'
    • 無引號:(?<href>[^\s>]*)
  • [^>]*>:匹配剩餘屬性至標籤結束
  • (?<text>.*?):非貪婪匹配連結文字(命名群組 text)
  • </a>:匹配結束標籤

完整實作範例

string html = @"<a href=""https://example.com"" class=""link">範例網站</a> 
                <a href='https://test.com' id='t1'>測試站</a>
                <a href=https://noquote.com>無引號</a>";

Regex re = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);

foreach (Match m in re.Matches(html))
{
    string link = m.Groups["href"].Value;
    // 移除文字中的巢狀 HTML 標籤
    string text = Regex.Replace(m.Groups["text"].Value, @"<[^>]*>", "");
    
    Console.WriteLine($"Link: {link}");
    Console.WriteLine($"Text: {text}");
    Console.WriteLine("---");
}

輸出結果

Link: https://example.com
Text: 範例網站
---
Link: https://test.com
Text: 測試站
---
Link: https://noquote.com
Text: 無引號

進階考量與替代方案

場景建議方案
簡單提取、效能敏感Regex(如本文)
複雜 HTML、巢狀結構、錯誤容忍HtmlAgilityPack / AngleSharp
需執行 JavaScript 渲染後內容Selenium / Playwright / Puppeteer
大規模爬蟲專案ScrapySharp / HttpClient + 解析器

常見陷阱提醒

  • 跨行匹配:需加 RegexOptions.Singleline 讓 . 匹配換行符
  • href 屬性順序不固定:正則假設 href 在前,實際 HTML 可能 <a class=""x"" href=""..."">
  • 巢狀 <a> 標籤:非法 HTML 但瀏覽器會容錯,正則難以正確處理
  • 編碼實體:文字可能包含 &amp; 等實體,需解碼

改良版正則(支援屬性順序不固定)

// 更健壯但較複雜的模式
string robustPattern = @"<a\s+(?:[^>]*?\s)?href=(""(?<href>[^""]*)""|'(?<href>[^']*)'|(?<href>[^\s>]*))[^>]*>(?<text>.*?)</a>";
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved