2

我创建了一个服务来加入、缩小和压缩 CMS 系统上的 css-references。例子:

前 :

<link href="/Files/css1.css" rel="stylesheet" type="text/css"/>
<link href="/Files/css2.css" rel="stylesheet" type="text/css"/>
<link href="/Files/css3.css" rel="stylesheet" type="text/css" media="all"/>

现在你可以写:

<link href="/min.ashx?files=/Files/css1.css,/Files/css2.css,/Files/css3.css" rel="stylesheet" type="text/css" />

我的下一个任务是自动获取 head 部分中的所有引用并将它们替换为一行,如示例中所示。

我应该只替换那些符合这些规则的:

  • Href 以 '/Files/' 开头,以避免尝试加载 externals
  • 只有具有属性 media 或具有 media="all" 的那些应该包括在内,因为生成的 css 文件将只有一个设置。

我可以访问页面的原始 html,但一直坚持成功定位引用,不知道我是否应该解析为 xml 或使用正则表达式等。

谁能指出我正确的方向?

4

2 回答 2

1

使用HTML 敏捷包。粗略的进攻计划:

  1. 将 html 内容加载到 HtmlDocument 对象中。

  2. 通过 XPath 在 HtmlDocument 对象中查找链接节点

    var nodes = doc.DocumentBody.SelectNodes("//head/link[@type='text/css']");

  3. 从这些节点中检索 href

    字符串 href = 节点[0].Attributes["href"].Value;

  4. 然后用新节点替换节点。

于 2012-10-03T09:53:27.277 回答
0

您可以使用正则表达式找到与您的规则匹配的链接:

<link href="(/Files/[^"]+)" .* media

它会给你引号内的文件路径,例如'/Files/css1.css'。您可以使用该结果来构建您想要的字符串。

C# 友好的正则表达式:

@"<link href=""(/Files/[^""]+)"" .* media"

使用 Regex.Match 方法获取分组:http: //msdn.microsoft.com/en-us/library/twcw2f1c.aspx

于 2012-10-03T10:04:27.377 回答