2011-05-03 80 views
2

我试图删除特定的CSS选择器,它的相关属性,如果有房产的比剧本中删除列表,没有更多的选择......删除CSS选择器,如果需要

我能得到脚本工作的一部分:http://jsfiddle.net/jnbdz/MarRr/5/

下面是代码:

$$('button')[0].addEvent('click', function(){ 

var css = document.id('css').get('text'); 

var newCss = css.replace(/(\n|\r|\s\s)/g, "") 
.replace(/(,\s*body\s*(?={)|,\s*body\s*(?=,)|body\s*,|,\s*head\s*(?={)|,\s*head\s*(?=,)|head\s*,)/gi, "") 
.replace(/(body\s*(?={)|head\s*(?={))/gi, "") 
.replace(/(^\{[^}]*?\}|\}\s*\{[^}]*?\})/gim, ""); 

document.id('cleancss').set('text', newCss); 

}); 

的问题是,如果我删除行打破了剧本我写过将无法删除那些不相关的特性任何选择器...

如果我把换行符它的工作原理...

另外,我想从那些用好正则表达式,如果我的代码是好的程序员知道...

感谢很多提前寻求帮助。

+0

我加了标签'mootools'因为你似乎是使用它去掉空格进一步压缩样式表。 – 2011-05-03 21:01:25

+1

你能给出每个输入的例子和所需的输出吗? – Jeff 2011-05-03 21:46:56

+0

用换行符:[link](http://jsfiddle.net/jnbdz/MarRr/5/) 没有换行符:[link](http://jsfiddle.net/MarRr/6/) – jnbdz 2011-05-04 03:14:59

回答

1

在上次替换中,您使用的是多行标志。如果你只有一条线,那么在第一次替换之后,你无法工作。因此,让我们先保留换行符,并在删除选择器后删除它们。

你也可以简化正则表达式。使用x(?=a|b)而不是x(?=a)|x(?=b)。你也不需要懒惰的比赛[^\}]*?

下面是一个工作示例。为了清晰起见,我只删除了body选择器。

$$('button')[0].addEvent('click', function(){ 

    var css = document.id('css').get('text'); 

    var newCss = css 
     // replace multiple tabs or spaces by one 
     .replace(/(|\t)+/g, " ") 
     // remove space at beginning of line 
     .replace(/(^\s)/gm, "") 
     // remove body in selector lists 
     .replace(/(,\s*body\s*(?={|,)|body\s*,)/gi, "") 
     // remove body before { 
     .replace(/(body\s*(?={))/gi, "") 
     // remove rules without selector 
     .replace(/[\n\r]+\{[^\}]*\}/g, "") 
     // remove linebreaks 
     .replace(/[\n\r]+/g, ""); 

    document.id('cleancss').set('text', newCss); 

}); 

您可以通过在{前或后:,