正则表达式匹配特定的HTML标签

时间:2011-01-16 18:37:15

标签: .net regex

我需要根据标记名称匹配html标记(整个标记)。

对于脚本标签,我有这个:

<script.+src=.+(\.js|\.axd).+(</script>|>)

它正确匹配以下html中的两个标记:

<script src="Scripts/JScript1.js" type="text/javascript" />
<script type="text/javascript" src="Scripts/JScript2.js" />

但是,当我用以下内容链接标签时:

<link.+href=.+(\.css).+(</link>|>)

它同时匹配所有这些(例如,它返回包含两个项目的一个匹配):

<link href="Stylesheets/StyleSheet1.css" rel="Stylesheet" type="text/css" />
<link href="Stylesheets/StyleSheet2.css" rel="Stylesheet" type="text/css" />

我在这里缺少什么?正则表达式基本相同,除了要匹配的文本?

另外,我知道正则表达式不是一个很好的HTML解析工具......我最终可能会最终使用HtmlAgilityPack,但这让我疯狂,我只想为自己的心理健康做一个答案!

2 个答案:

答案 0 :(得分:2)

。+通配符匹配任何内容。这样:

<link.+href=.+(\.css).+(</link>|>)

像这样的匹配:

<link      => <link
.+         => href="Stylesheets/StyleSheet1.css" rel="Stylesheet" type="text/css" />
              <link 
 href=     => href=
 .+        => "Stylesheets/StyleSheet2
 \.css     => .css
 .+        => " rel="Stylesheet" type="text/css" /
 </link>|> => >

相反,请考虑使用[^&gt;] +代替。+。另外,你真的关心结束标签吗?

<link[^>]+href=[^>]+(\.css)[^>]+>

答案 1 :(得分:1)

问题是你的正则表达式是贪婪的。每当你匹配.+时,这就是贪婪的;你需要通过向它们附加一个?来使它变得非贪婪,这使得它匹配有限数量的字符以满足模式并且不会超出它到下一个匹配的字符串。

将模式更改为:"<link.+?href=.+?(\.css).+?(</link>|>)"

然后,您需要使用Regex.Matches来获取多个匹配并循环遍历它们。