我过去使用过它,但只有当我确切知道我将发送到正则表达式中的内容时——主要是因为我确信那里会有可能破坏它的语法(尤其是使用 mixins、css 动画之类的) 、css 变量和媒体查询)。正是出于这些原因,您可能应该遵循马里奥的回答。
但是,它已经处理了我自己扔给它的大多数 css 文件,并且可能会帮助其他人......虽然它不是为使用像您正在使用的数组结构而量身定制的,但这可能是很容易改变。显然,您可以通过摆脱RegExp
并indexOf
像 shhac 所做的那样使用来优化事物,但我发现 RegExp 的表现力更容易使用,并且在需要时更容易扩展。
几点注意事项
- 它假定 CSS 中没有注释- 您始终可以添加替换以去除注释。
- 它依赖于可用的 JSON.parse 方法- 您始终可以包含非 JSON 后备。
带有注释的代码:
window.onload = function(){
/// this is designed to find a <style> element in the page with id="css"
var entireStylesheetString = document.getElementById('css').innerHTML;
var css = String('{'+entireStylesheetString+'}')
/// convert double quotes to single to avoid having to escape
.replace(/"/gi,"'")
/// replace all whitespace sequences with single space
.replace(/\s+/g,' ')
/// sort the first open brace so things are neat
.replace(/^{/,'{\n')
/// sort the newlines so each declaration is on own line
.replace(/\}/g,'}\n')
/// find the selectors and wrap them with quotes for JSON keys
.replace(/\n\s*([^\{]+)\s+?\{/g,'\n"$1":{')
/// find an attribute and wrap again with JSON key quotes
.replace(/([\{;])\s*([^:"\s]+)\s*:/g,'$1"$2":')
/// find values and wrap with JSON value quotes
.replace(/":\s*([^\}\{;]+)\s*(;|(\}))/g,'":"$1",$3')
/// add commas after each JSON object
.replace(/\}/g,'},')
/// make sure we don't have too many commas
.replace(/,\s*\}/g,'}');
/// remove the final end comma
css = css.substring(0,css.length-2);
try{
/// parse using JSON
console.log(JSON.parse(css));
}catch(ee){
console.log(ee);
}
};
它的代码很寂寞:
window.onload = function(){
var entireStylesheetString = document.getElementById('css').innerHTML;
var css = String('{'+entireStylesheetString+'}')
.replace(/"/gi,"'")
.replace(/\s+/g,' ')
.replace(/^{/,'{\n')
.replace(/\}/g,'}\n')
.replace(/\n\s*([^\{]+)\s+?\{/g,'\n"$1":{')
.replace(/([\{;])\s*([^:"\s]+)\s*:/g,'$1"$2":')
.replace(/":\s*([^\}\{;]+)\s*(;|(\}))/g,'":"$1",$3')
.replace(/\}/g,'},')
.replace(/,\s*\}/g,'}');
css = css.substring(0,css.length-2);
try{console.log(JSON.parse(css));}catch(ee){console.log(ee);}
};