【问题标题】:C# regex parse span [duplicate]C#正则表达式解析跨度[重复]
【发布时间】:2013-12-16 14:39:34
【问题描述】:

我有一个要求,我只需要从此 HTML 获取链接

"<span class=""name""><a href=Details.aspx?entityID=1&hash=20&searchFunctionID=53b&type=Advanced&nameSet=Entities&q=a&textSearchType=ExactPhrase&orgTypes=01%2c02%2c03%2c04%2c05%2c06%2c07%2c08%2c09%2c10%2c11%2c12%2c13%2c14%2c15%2c16%2c90%2c96%2c98%2c99> GOOGLE CORPORATION  </a> </span>  <br /> <span class=typeDescription>  09  -  Analytics Company </span>"

我需要的输出是

Details.aspx?entityID=1&hash=20&searchFunctionID=53b&type=Advanced&nameSet=Entities&q=a&textSearchType=ExactPhrase&orgTypes=01%2c02%2c03%2c04%2c05%2c06%2c07%2c08%2c09%2c10%2c11%2c12%2c13%2c14%2c15%2c16%2c90%2c96%2c98%2c99

我用过

string sPattern ="[<a href=](.*?(99))";
MatchCollection mcMatches = Regex.Matches(input,sPattern);
foreach (Match m in mcMatches)
{
   Console.WriteLine(m.Value);
}

这没有给我正确的输出。谁能指出我正确的方向。

【问题讨论】:

  • 用正则表达式解析 HTML? Bad idea! 相反,为什么不使用适当的 HTML 解析器,例如 Html Agility Pack
  • 请不要使用 RegEx 解析 HTML。

标签: c# html regex


【解决方案1】:

如上所述,使用 Regex 解析 HTML 是 not very good idea。我建议你使用HtmlAgilityPack(你可以从 NuGet 获得):

HtmlDocument hdoc = new HtmlDocument();            
hdoc.LoadHtml(@"<span class=""name""><a href=Details.aspx?entityID=1&hash=20&searchFunctionID=53b&type=Advanced&nameSet=Entities&q=a&textSearchType=ExactPhrase&orgTypes=01%2c02%2c03%2c04%2c05%2c06%2c07%2c08%2c09%2c10%2c11%2c12%2c13%2c14%2c15%2c16%2c90%2c96%2c98%2c99> GOOGLE CORPORATION  </a> </span>  <br /> <span class=typeDescription>  09  -  Analytics Company </span>");
var href = hdoc.DocumentNode.SelectSingleNode("//a").Attributes["href"].Value;

它为您提供href 属性的值。

【讨论】:

    【解决方案2】:

    正如 Shaamaan 所说,Regex 不是解析 HTML 的正确方法,对于您给出的示例,一个更好的 Regex 会是,尽管不能保证它总是有效:

    (?:<a href=)([^">]*)
    

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 2023-03-08
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多