私は過去にこれを使用しましたが、正規表現に何を送信するかを正確に知っている場合にのみ、それを壊す可能性のある構文があると確信しているためです(特にミックスイン、cssアニメーションなど) 、css変数、およびメディアクエリ)。これらの理由から、おそらくマリオの答えに従う必要があります。
しかし、それは私が投げた自分のcssファイルの大部分で機能し、他の人を助けるかもしれません...あなたが使用しているような配列構造で動作するように調整されていませんが、それは可能性があります簡単に変更できます。RegExp
明らかに、shhacのように削除して使用することで最適化できますがindexOf
、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);}
};