2012-09-24 45 views
2

我试图(和失败)指定一个正则表达式,我可以用PHP的preg_match_all()使用以下正则表达式匹配:计数CSS选择

.foo { bar } 
.baz, .bot { bip, bop } 

我需要计算所有{只有,这不在{}之间。鉴于上面的例子,我应该有三场比赛。我的困难(无知)是我不明白如何指定“花括号之间不匹配逗号”部分。我现在的正则表达式所有逗号开放大括号匹配:

({)*(,)* 
+0

3场比赛应该是.foo,.bar和.bot,对吧?不是吧,bip和bop? – sp00m

+0

@ sp00m - 文字不重要。我试图计算CSS选择器的总数,它可以被确定(单向)为“开启花括号的总数”加上“不用花括号括起来的逗号的总数”。当然还有其他一些方法可行。 – benmarks

回答

2

试试这个:

\{.+?\}|, 

含义:

\{ # If you can match a brace 
.+? # then also grab the minimum amount of other charactors 
\} # until you reach the closing brace 
|, # or if there was no brace then just match a comma 
+1

太棒了!只需要忽略换行符:'preg_match_all('/ \ {。+?\} |,/ s',$ contents,$ matched);' – benmarks

1

如果你想接近,但没有确切的统计,这是一个快速肮脏的方式去做

$selector_count = substr_count($css, ',') + substr_count($css, '{') - substr_count($css, '@media'); 

它会计算css中的任何,,因此使用,的规则(如rgba(0, 0, 0, 0.5))也会计算在内。如果您了解这些限制,这会很有用。接受的解决方案不适用于@media