【发布时间】:2016-09-05 18:45:11
【问题描述】:
我创建了这段代码来计算 css 规则的优先级
var selectorText = "body";
A = selectorText.match(/#/gm); // id
A = !A ? 0 : A.length;
B1 = selectorText.match(/\\./gm); // class
B1 = !B1 ? 0 : B1.length;
B2 = selectorText.match(/[[]/gm); // attribute selector
B2 = !B2 ? 0 : B2.length;
B3 = selectorText.match(/[\\w\\d_\\s^]:(?!:)/gm); // pseudo třída
B3 = !B3 ? 0 : B3.length;
B = B1 + B2 + B3;
C1 = selectorText.match(/::/gm); // pseudo element
C1 = !C1 ? 0 : C1.length;
C2 = selectorText.match(/\\w+[$\\s#\\.:\\[]/gm); // element
C2 = !C2 ? 0 : C2.length;
C = C1 + C2;
A *= 10000;
B *= 100;
alert(C)
选择器中的匹配项(A、B 或 C)不得超过 100 个。 由于某种原因,C 的结果为 0(但我使用“body”选择器)。你能建议如何纠正最后一场比赛吗?您还看到代码中有任何错误吗?
注意:
最初的问题只是“body”选择器,但我认为 any 选择器或多个选择器是这样的:“div#menu ul li, div#id, div.class” 选择器可以包含伪类、伪元素、属性选择器。在 C2 正则表达式的情况下,我试图找到最后一个字符串中总共 5 个元素的元素计数(那么 C2 应该是 5)。
【问题讨论】:
-
selectorText不包含::,.match(/::/,gm)应该返回null -
你不能用正则表达式解析 CSS。或者至少不是这样。考虑例如
#a, #b,它的特异性是(1,0,0),但这表示(2,0,0)。并且您不能在逗号处拆分并分别计算每个部分,因为某些操作数有逗号。所以你需要一个 CSS 解析器。 -
@user1141649 你需要一个用 JS 编写的 CSS 解析器来公开这些信息。
-
@Oriol 我可以用
var selectorText = "div#id, div.body;#a > :matches(.b, #c)";之类的字符串替换逗号来替换“^”之类的字符吗?var selectorText = "div#id, div.body;#a > :matches(.b^ #c)";我可以使用 .replace 搜索括号的内容并替换它。 -
@user1141649 您想替换括号内的逗号吗?这可能行得通,但是 JS 中的正则表达式无法处理递归,并且嵌套括号的数量可以是任意的。然后您需要撤消替换以递归计算
.b, #c的特异性。
标签: javascript css