0

誰かが以前にこの質問を見たことがある場合は、リンクしてください。おそらく私は間違ったものを検索しています。cssファイルを解析した結果しか得られません。基本的に、私はセレクターの配列を持っています。

[".thislink", "#myid"]

私はcss3セレクターのようにフォーマットされた文字列セレクターを渡すことを探しています、例:

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

.matchに変換し、セレクターの配列に分割します。理想的には、次のようにします。

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

ループすることができます。次に、任意の:not()セレクターで同じ内訳を使用して、「not」の2番目の配列を取得します。これは、個々のセレクターの元の配列と照合できます。

タグ、クラス、ID、attr、および:notセレクターだけで十分です。[attr=val]自分自身をどうやって分解するかがわかる:not(selectorshere)と思います。

PS:文字列セレクターで元の配列値を一致させるのは簡単だと思いますが、実際にはセレクターの配列はありません。なぜ私がこのようにやっているのかを説明するには数段落かかるので、私を信じてください、私はそれを行うことができません=)

4

1 に答える 1

3

十分な正規表現を見つけることができない場合に備えて、PEG.js * のような JavaScript パーサー ジェネレーターをお勧めします。文法をいじくり回し、結果に満足したらパーサーをダウンロードできる PEG.jsのオンライン バージョンがあります。

[ * ] PEG -構文解析式文法

文法のヘルプについては、CSS3 構文に関する W3C のワーキング ドラフト セレクター レベル 3 に関する W3C の推奨事項を参照してください。

私は時間をかけて遊んで、単一のセレクター (要素/id/属性/クラス/疑似) の簡略化された文法を考え出しました。あなたはそれを調べて、あちこちで改良したいと思うでしょう。

/*
 * 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 に答える