2010-10-23 2 views
2

Essentiellement, je tente d'extraire le dernier nom de balise d'une poignée de sélecteurs de css différents.Extraction de la dernière baliseNom de divers sélecteurs

J'ai implémenté avec succès ce dont je parle en javascript, je cherche un moyen plus compact en utilisant seulement 1 expression regex de préférence.

Voici ce que j'ai réussi à faire.

//Trim selector, remove [attr] selectors due to conflicts, and standardize >,~, 
selector=selector.replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g,'') 
selector=selector.replace(/\[[^\]]*\]/g,'[]').replace(/\s*([>~\s])\s*/g,'$1'); 
var theSplit = selector.split(/[>~\s]/); 
selector = /^[^.\[:]*/.exec(theSplit[theSplit.length-1]) || "*"; 

Je ne cherche à soutenir css 2.0 sélecteurs qui sont 100% pris en charge par Internet Explorer 7.

Par exemple + sélecteur et: sélecteurs premier enfant sont statiques dans IE7 et donc je n'ai pas besoin pour les soutenir. Voici une liste de sélecteurs CSS qui doivent fonctionner.

#test span ul a 
#test >span[style="background:green"] 
#id + span ~ article.class 
section header.class 
body 
div 
body div 
div p 
div > p 
div ~ p 
div[class^=exa][class$=mple] 
div p a 
.note 
div.example 
ul .tocline2 
#title         
h1#title 
div #title          
ul.toc li.tocline2 
ul.toc > li.tocline2 
a[href][lang][class] 
div[class] 
div[class=example] 
div[class^=exa] 
div[class$=mple] 
div[class*=e] 
div[class|=dialog] 
div[class!=made_up] 
div[class~=example] 

Édition: J'ai fini par utiliser ce script. Il prend même en considération le sélecteur universel

var lastTagName = selector.replace(/\[[^\]]+\]|[\.#][\w-]+|\s*$/g,'').replace(/^.*[^\w]/, '')||'*' 

Répondre

1

Les choses au début du sélecteur devrait être assez facile à enlever comme dernière étape, alors concentrons-nous sur le retrait des deux types de déchets de la fin première. C'est entre crochets et d'autres choses qui suivent un . ou #.

str = str.replace(/\[[^\]]+\]/g, '').replace(/[\.#][a-z0-9]+/gi, ''); 

enlver tout entre crochets (dans l'expression entière, il est normal si elle attrape des choses plus tôt), et de même pour . et # sélecteurs. Puis, enfin, supprimez tout ce qui mène à un caractère non alphanumérique, qui couvre les espaces >, et cetera. Cela laissera que le dernier « mot » (dans ce cas, un nom de tag) dans la chaîne:

str = str.replace(/^.*[^a-z0-9]/i, ''); 

A jsFiddle pour l'essayer: http://jsfiddle.net/JAA98/

+0

En fin de compte, je fini par utiliser votre script (avec un couple modifications). Connaissez-vous un moyen de simplifier à une expression? – William

+0

La puissance de cette approche est, en fait, qu'elle prend deux étapes. Les deux premiers (recherche des crochets et des modificateurs '.' /' # 'peuvent être combinés en une expression avec' | ', mais la combinaison des deux étapes nécessiterait de décrire exactement comment les différents bits des sélecteurs se répètent. Bonus ajouté: pour la plupart, c'est en fait lisible. – VoteyDisciple