2010-07-25 43 views
2

我需要使用JavaScript分裂,但我很没用在正则表达式因此,我想要做的就是采取一个文本是CSS状结构如:JavaScript的正则表达式的帮助

var str = "selector { 
    width: 100px; 
    height: 20px; 
} 

.anything{ 
    margin: 5%; 
}"; 

str.split(/regex goes here/); 

预计输出

[ 
    0 = selector{width: 100px; height: 20px;}, 
    1 = .anything{margin: 5%;} 
] 

希望它不是太混乱,但请询问是否有疑问。

谢谢。

回答

5

我不会为此使用拆分。相反,使用此正则表达式来提取每个规则:

([\s\S]*?{[\s\S]+?}) 

很简单,但只要有不{和}在规则本身(这是我所期望的是罕见的)字符应该工作。只要CSS在语法上有效,我的正则表达式会忽略空格和换行符。我使用[\s\S]代替.,因为.与换行符不匹配。

在你的情况下,提取的规则将是:

var myCSS = "CSS goes here"; 
var rules = myCSS.match(/([\s\S]*?{[\s\S]+?})/); 

编辑:

按了提问者的要求,我已经修改了我的正则表达式忽略选择,例如:a {} 。但是,它仍然会赶上a { }。我会尽力为此找到一个解决方案,但同时你可能只需要处理每个规则并删除空的规则。

+0

thnx能够完成这项工作......那么如果我决定在规则内部放置一个{},会有一种方法可以忽略它们? – Val 2010-07-25 01:19:39

+0

啊,把第二个'*'换成'+'。 (请参阅修改后的答案)。 – 2010-07-25 01:21:25

+0

omg thnx我一直在玩正则表达式,我仍然不明白它做的事情我想要它做的事情:) ...你已经把我一辈子的时间,因为那多久会采取我:)。 ..即时做这个脚本,我想把你的信用,如果你喜欢张贴你的细节,希望去信用。 thnx再 – Val 2010-07-25 01:25:04

1

正则表达式不适用于解析。你应该写或找到一个CSS解析器来完成这项工作,但是这样可以让你的代码更长。

试试这个:

var style = document.createElement('style'); 
style.innerHTML = ".test { color: red; } .test2 { }"; 
var head = document.getElementsByTagName('head')[0]; 
head.appendChild(style); 
var style = document.styleSheets[document.styleSheets.length - 1]; 
style.disabled = true; 
var rules = style.cssRules; 
var list = []; 
for (var i = 0; i < rules.length; i ++) { 
    list.push(rules[i].cssText + ""); 
} 
list; 

它要求浏览器的CSS语法分析器为你做这项工作。

由于CSS语法的非递归性质,您可以编写一个巨大的正则表达式来解析CSS。

+0

不错的一个thanx :)他们现在会用规则解散额外的“{}”,例如'select {value:{value}}'这就是我需要做的。 – Val 2010-07-25 01:35:04