【问题标题】:Regex parsing of CSS @media queries (and other nested selectors)CSS @media 查询(和其他嵌套选择器)的正则表达式解析
【发布时间】:2014-04-14 06:33:24
【问题描述】:

我正在开发一个节点脚本,它使用正则表达式来解析 CSS 文件,它运行良好……除了处理 @media 查询时。问题是由于嵌套的花括号让我很适合。我基本上想在媒体查询中创建一个包含所有内容的捕获组:这就是我到目前为止所得到的。

@media[^{]+\{([^}]+)}\s*}

这适用于简单的事情,例如:

@media (max-width: 868px) {
  aside .size-toggle {
    display: none;
  }
}

但是不能拾取多个嵌套规则,像这样:

@media (max-width: 767px) {
  #wrapper.sidebar-display aside {
    left: 0;
    transition: all 0.5s ease;
    -webkit-transition: all 0.5s ease;
    -moz-transition: all 0.5s ease;
    -ms-transition: all 0.5s ease;
    -o-transition: all 0.5s ease;
  }
  #wrapper.sidebar-display #top-nav {
    left: 0;
    right: -194px;
  }
}

我需要如何修改我的正则表达式,以便捕获组包含每个单独的 @media 查询中的所有选择器和规则?

【问题讨论】:

  • 您使用什么语言/平台?
  • 这听起来很危险。您的解析器如何处理 Internet Explorer 特定的图像过滤器?它们有非常不同的模式,这在 CSS 中很常见,可能很容易破坏解析器。
  • 它是在节点上运行的 javascript。据我所知,它可以很好地处理 IE 特定的废话。该代码使用([^@{}]+)} 来捕获每个选择器的全部内容,然后根据: 将每个规则分解为本质上的键/值对。它是双 { 导致它在媒体查询的情况下崩溃,这是我需要帮助的。我的计划是捕获媒体查询的全部内容,然后通过脚本的常规部分运行该内容,本质上将其视为一个自包含的 CSS 文件。
  • 看这个相关问题stackoverflow.com/questions/14145620/… 答案是用PHP写的,但是应该很容易移植到JS。
  • 您的问题缺乏您想要达到的目标的上下文,但通常使用正则表达式编写自己的“解析器”是个坏主意。你应该改用一些成熟的模块,比如css-parse

标签: javascript css regex node.js


【解决方案1】:

试试这个正则表达式:

/@media[^{]+\{([\s\S]+?})\s*}/g

演示

http://regex101.com/r/iT2eR5

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 2017-07-15
    • 2015-04-03
    • 2011-10-29
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多