Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式从HTML字符串解析HREF_C#_Regex - Fatal编程技术网

C# 使用正则表达式从HTML字符串解析HREF

C# 使用正则表达式从HTML字符串解析HREF,c#,regex,C#,Regex,我需要用html解析一个zip文件的链接。此zipfile的名称每月都会更改。下面是我需要解析的HTML片段: 我需要的字符串是“http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“因此,我可以使用WebClient下载该文件。zip文件URL中每月保持不变的唯一部分是“http://nppes.viva-it.com/". 是否有一种方法可以使用正则表达式来解析完整的URL,“http://nppes.viva-i

我需要用html解析一个zip文件的链接。此zipfile的名称每月都会更改。下面是我需要解析的HTML片段:



我需要的字符串是“http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“因此,我可以使用WebClient下载该文件。zip文件URL中每月保持不变的唯一部分是“http://nppes.viva-it.com/". 是否有一种方法可以使用正则表达式来解析完整的URL,“http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“,超出HTML?

如果页面上只链接到一个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+ (?:".*?"|'.*?'|[^>]*?)+ 
>
“']|“[^”]*“[^']*”)*?(?\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+ (?:".*?"|'.*?'|[^>]*?)+ 
>
“']|“[^”]*“[^']*”)*?(?\s*(['”])\s*(http://nppes\.viva it\.com/(?:(?!\g{-2})。+\.zip)\s*\g{-2})
|(?>(?!\s*['”])\s*(http://nppes\.viva it\.com/[^\s>]*\.zip)(?=\s}>)
)
)
\s+(?:“*?”|“.*?”|[^>]*?)+
>
通过使用:

var html=”“;
var doc=新的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“
value


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

在一般情况下,使用正则表达式解析HTML是行不通的。无论您构建的模式多么狭窄,一个完全合法的HTML文件都可以击败它。使用真正的parserSee:
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);