无法相应地解析html中的元标记

时间:2017-10-06 06:46:33

标签: c# regex

我正在从HTML解析元标记。一切正常,但在某些情况下,我无法相应地解析元标记。

这是标记格式<meta property="fb:pages" content="6456456"/>

正则表达式string regexImgSrc = @"<meta property.*?>";

但有时我会从html中获取另一种格式的元标记:

<meta data-react-helmet="true" property="article:publisher" content=""/>

所以Regex没有得到预期的输出。 我只需要meta标签的属性名称和内容。 这是我的代码

      string regexImgSrc = @"<meta property.*?>";      
      MatchCollection matches = Regex.Matches(htmldata, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);

请帮忙

提前致谢

2 个答案:

答案 0 :(得分:0)

只要您的html非常有限,使用正则表达式解析html就可以了。例如。你只需解析一堆它们,例如作为一个后台进程。即使在这种情况下,您也必须愿意在需要时更改正则表达式。

这是一个稍微强化的正则表达式。请注意,它仍然不符合所有内容:

<meta[^>]*?property=("[^"]*"|'[^']*')[^>/]*\/>

演示here。 说明:

  • <meta[^>]匹配代码的开头
  • [^>]*?匹配不是结束标记的内容。 *?是一个懒惰的量词,所以匹配稍微快一点
  • property=匹配属性
  • ("[^"]*"|'[^']*')允许使用撇号或引号
  • 包围属性值
  • 然后再次[^>/]*匹配到最后的内容
  • 然后这是标记\/>
  • 的结尾

那么解析html的真正解决方案是什么?好吧,使用像HTML agility pack这样的html解析器。

答案 1 :(得分:0)

如果您想继续使用(简单)正则表达式,可以使用:

<meta (?:.*? )*?property.*?>

(?:[^<>]*? )*?表示:

  • ?:不创建捕获组
  • .*?任何char零次或多次,尽可能少
  • 空间
  • (...)*?整件事零次或多次

实际上,此正则表达式将匹配任何元标记,其中包含单词“property”。例如,<meta some-attr="some property" />也是一个匹配。

这是一种快速而肮脏的方式,我也不建议使用正则表达式。


PS:我注意到你可以在“属性”之后添加=来改善正则表达式:<meta (?:.*? )*?property=.*?>