【问题标题】:Normalize Case of CSS selectors using C#使用 C# 规范化 CSS 选择器的大小写
【发布时间】:2017-05-14 22:53:24
【问题描述】:

我正在用 C# 构建一个 CSS 解析器,我需要对 CSS 选择器的情况进行“规范化”。我的意思是我想让标签名称小写,但保持类和 id 的原样。

例如,如果我有一个字符串,例如:

.Header Td.selected

我想更改规范化大小写并将其更改为:

.Header td.selected

我想保留类和 id 的大小写,因为在 CSS 中它们是区分大小写的。而且我需要将不区分大小写的部分更改为小写,以避免在我的解析器中存储重复的 CSS 规则。

因此,我需要一些代码来区分不区分大小写的部分并将它们更改为小写。我该怎么做?

【问题讨论】:

  • 看来你的问题已经有了答案。您需要将 html 标签与其他标签区分开来,考虑到只有一定数量的标签,这应该不难。
  • HTML 标签名称是 CSS 中唯一没有以句点、哈希、括号等开头的东西。所以应该不会太难。
  • 请记住,虽然 HTML 不区分大小写,但 XML 是。以这种方式处理用于 XML 文件的样式表会使它变得面目全非。
  • 我需要它用于一个应用程序,它不会应用于 XML。
  • 试试Regex.Replace(s, @"\s\w+", m => m.Value.ToLower())

标签: c# css regex css-selectors


【解决方案1】:
selector = Regex.Replace(
    selector,
    @"(?<![#.:])(-?\b[^\W\d][-\w]*)",
    m => m.Value.ToLower())

它会查找前面没有#.: 的标识符。

-?\b[^\W\d][-\w]*-?[^\W\d][-\w]* 匹配 CSS identifier,仅限于 Basic Latin-1 (U+0000-U+007F)。

h           [0-9a-f]
nonascii    [\240-\377]
unicode     \\{h}{1,6}(\r\n|[ \t\r\n\f])?
escape      {unicode}|\\[^\r\n\f0-9a-f]
nmstart     [_a-z]|{nonascii}|{escape}
nmchar      [_a-z0-9-]|{nonascii}|{escape}
ident       -?{nmstart}{nmchar}*

如果字符串嵌入到完整的 css 文档中,您可以使用

css = Regex.Replace(
    css,
    @"(?<![#.:])(-?\b[^\W\d][-\w]*)(?=(?:\s*(?:[+>,]|[#.:]?-?[^\W\d][-\w]*|\[.*?]))*\s*\{)",
    m => m.Value.ToLower())

它将确保单词是选择器的一部分,而不是声明的一部分。为了匹配,选择器后面必须跟{

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 2015-10-27
    • 2010-11-12
    • 2011-08-05
    • 2013-04-26
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多