0

如果有人以前看过这个问题,请链接,也许我正在搜索错误的东西。除了解析 css 文件的结果外,我什么也得不到。基本上,我有一组选择器,比如

[".thislink", "#myid"].

我希望传递任何格式为 css3 选择器的字符串选择器,例如:

a.thislink:not(.ignore)[href^=http://]

进入 .match 并将其拆分为选择器数组,理想情况下:

[a, .thislink, :not(.ignore), [href^=http://]]

我可以循环通过。然后,我将在任何 :not() 选择器上使用相同的细分来获得第二个“not”数组,我可以将其与我原来的单个选择器数组匹配。

我只需要标签、类、ID、attr 和 :not 选择器。我想,我可以弄清楚如何分解[attr=val]:not(selectorshere)我自己。

PS:我知道在字符串选择器中匹配我的原始数组值很容易,但是,我实际上没有选择器数组。需要几段来解释我为什么要这样做,所以相信我,我做不到 =)

4

1 回答 1

3

万一你找不到足够的正则表达式,我可以建议一个 JavaScript 解析器生成器,比如PEG.js *。有一个在线版本的 PEG.js,它允许您修改语法,然后在对结果满意后下载解析器。

[ * ] PEG -解析表达式语法

有关语法的帮助,您应该查阅W3C 关于 CSS3 语法的工作草案 W3C 关于 Selectors Level 3 的建议

我花时间玩了一下,为单个选择器(元素/id/attr/class/pseudo)想出了一个简化的语法。你可能想在这里和那里重新审视它并改进它。

/*
 * PEG.js grammar
 */
start      = element? hash? (class / attr / pseudo)*
element    = '*' / ident

ident      = i:(nmstart) j:(nmchar*) {return i + j.join('');}
hash       = h:('#' ident) {return h.join('');}
class      = c:('.' ident) {return c.join('');}
attr       = a:('[' (b:[^\]]+ {return b.join('');}) ']') {return a.join('');}
pseudo     = p:(':' function) {return p.join('');}

nmstart    = [a-z] / nonascii
nmchar     = [a-z0-9-] / nonascii
function   = f:(ident '(' body ')') {return f.join('');}
body       = b:[^\)]+ {return b.join('');}

nonascii   = [\x80-\xff]
_          = [ \t\n\r]+ {return '';}
于 2012-10-18T23:14:21.887 回答