RegEx美化缩小的CSS

时间:2012-11-21 20:26:59

标签: javascript regex

我正在尝试使用JavaScript来美化CSS代码。

缩小的CSS代码如下所示:

str = 'body{margin:0;padding:0;}section,article,.class{font-size:2em;}'

到目前为止,我可以通过使用多个替换来美化代码:

str.replace(/{/g, " {\n")
    .replace(/}/g, "}\n")
    .replace(/;/g,";\n")
    .replace(/,/g, ",\n")

这是有效的,但我想改进它

  • 如何在每个属性之前添加标签?
  • 是否可以在一个RegEx中聚合所有替换呼叫?
  • 是否可以检测到最后没有分号的属性? (这是有效的CSS)

2 个答案:

答案 0 :(得分:3)

我认为很难减少正则表达式的数量,因为有时你只需要一个换行符,有时你也需要一个制表符。有时您需要回写一个,有时两个字符。但是这里有一个替换列表,使CSS看起来很漂亮:

str.replace(/\{/g, " {\n\t")        // Line-break and tab after opening {
   .replace(/;([^}])/g, ";\n\t$1")  // Line-break and tab after every ; except
                                    // for the last one
   .replace(/;\}/g, ";\n}\n\n")     // Line-break only after the last ; then two
                                    // line-breaks after the }
   .replace(/([^\n])\}/g, "$1;\n}") // Line-break before and two after } that
                                    // have not been affected yet
   .replace(/,/g, ",\n")            // line break after comma
   .trim()                          // remove leading and trailing whitespace

做到这一点:

 str = 'body{margin:0;padding:0}section,article,.class{font-size:2em;}'

看起来像这样:

body {
    margin:0;
    padding:0;
}

section,
article,
.class {
    font-size:2em;
}

如果您不关心那些被遗漏的分号被放回原位,您可以通过更改顺序来缩短这一点:

str.replace(/\{/g, " {\n\t")
   .replace(/\}/g, "\n}\n\n")    // 1 \n before and 2 \n after each }
   .replace(/;(?!\n)/g, ";\n\t") // \n\t after each ; that was not affected
   .replace(/,/g, ",\n")
   .trim()

答案 1 :(得分:1)

我不知道CSS是否是一种常规语言(我的猜测是肯定的),但无论如何都应该使用正则表达式。

无论是否包含分号,都无需匹配最后一个属性。首先匹配所有关闭花括号,就像你已经完成的那样,除了在每个之前和之后添加换行符:

.replace(/}/g, "\n}\n")

然后匹配所有分号除了来自换行符之前的分号(由上面的正则表达式插入)并使用\t添加换行符和标签每个人之后的角色:

.replace(/;([^\n])/g, ";\n\t$1")


不幸的是,这只是冰山一角。如果您打算在这些选择器周围添加空格,请不要忘记查找所有不同类型的选择器,例如包含:>的选择器。你可能还需要考虑很多其他的东西。