我正在从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);
请帮忙
提前致谢
答案 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=.*?>