使用正则表达式从 HTML 字符串分析 HREF

本文关键字:HREF 字符串 HTML 正则表达式 | 更新日期: 2023-09-27 18:31:09

我需要解析一个指向 html 的 zip 文件的链接。 此压缩文件的名称每个月都会更改。 这是我需要解析的 HTML 片段:

<a href="http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip">

我需要获取的字符串是"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip",以便我可以使用WebClient下载文件。 该 zip 文件 URL 中每月保持不变的唯一部分是"http://nppes.viva-it.com/"。 有没有办法使用正则表达式从 HTML 中解析完整的 URL"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip"?

使用正则表达式从 HTML 字符串分析 HREF

通过使用

HtmlAgilityPack:

var html = "<a href='"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip'">";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var anchor = doc.DocumentNode.SelectSingleNode("//a");
var href = anchor.GetAttributeValue("href", null);

现在href变量保存"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip"值。

它不是比正则表达式更简单吗?

如果页面上只有一个 ZIP 链接,没问题:

Regex re = new Regex(@"http://nppes'.viva-it'.com/.+'.zip");
re.Match(html).Value // To get the matched URL

这是一个演示。

这是一个原始正则表达式 - 使用分支重置。
答案在捕获缓冲区 2 中。

<a 
  (?='s) 
  (?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<='s)
    href 's*=
    (?|
        (?> 's* (['"]) 's* (http://nppes'.viva-it'.com/ (?:(?!'g{-2}) .)+ '.zip ) 's*     'g{-2} )
      | (?> (?!'s*['"]) 's* () (http://nppes'.viva-it'.com/ [^'s>]* '.zip ) (?='s|>) )
    )
  )
  's+ (?:".*?"|'.*?'|[^>]*?)+ 
>

不确定 C# 是否可以执行分支重置。如果不能,则此变体有效。
答案始终是捕获缓冲区 2 与捕获缓冲区 3 匹配的结果。

<a 
  (?='s) 
  (?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<='s)
    href 's*=
    (?:
        (?> 's* (['"]) 's* (http://nppes'.viva-it'.com/ (?:(?!'g{-2}) .)+ '.zip ) 's* 'g{-2} )
      | (?> (?!'s*['"]) 's* (http://nppes'.viva-it'.com/ [^'s>]* '.zip ) (?='s|>) )
    )
  )
  's+ (?:".*?"|'.*?'|[^>]*?)+ 
>