2017-10-06 83 views
-1

我正在解析HTML中的元标记。一切工作正常,但在某些情况下,我无法相应地解析meta标签。无法从html解析元标记

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

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

但有时我得到另一种格式meta标签从HTML这样的:

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

所以正则表达式是不获得预期的产出。 我只需要属性名称和meta标签中的内容。 这里是我的代码

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

请帮

在此先感谢

+0

不建议使用正则表达式解析HTML。 html不规则,正则表达式用于正则表达式。 – jdweng

+1

为什么你不使用HTML解析库(Html Agility Pack)。它只是一个建议 –

+0

不,我不想使用任何库或第三方工具@Usman – sachin

回答

0

解析HTML与正则表达式的作品只要你HTMLS是非常有限的。例如。你只是解析一堆,例如作为后台进程。即使在这种情况下,您必须愿意在需要时更改您的正则表达式。

这是一个稍微增强的正则表达式。请注意,它仍然不符合一切:

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

演示here。 说明:

  • <meta[^>]标签的开头匹配
  • [^>]*?匹配的东西,这不是一个结束标记。该*?是一个懒惰的量词,所以比赛会发生稍快
  • property= property属性
  • ("[^"]*"|'[^']*')允许属性值要么用撇号或引号
  • 然后再次[^>/]*匹配的东西到最后被包围相匹配
  • 那么这就是标签\/>

结束那么什么是分析HTML真正的解决办法?那么,使用像HTML agility pack这样的html解析器。

+0

无论谁低估,请解释,出了什么问题。即它不工作吗?我不是警告OP关于这个正则表达式的限制吗?我不是也建议一个基于解析器的解决方案吗? –

0

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

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

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

  • ?:不创建捕获组
  • .*?任何字符零次或多次,尽可能少的次数
  • space
  • (...)*?整件事零次或多次

事实上,这正则表达式将匹配任何meta标签,其中包含了“财产”一词。例如<meta some-attr="some property" />也是一场比赛。

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


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