Извлечь последний tagName из различных селекторов - PullRequest
2 голосов
/ 23 октября 2010

В основном я пытаюсь извлечь последнее имя тега из нескольких селекторов CSS.

Я успешно реализовал то, о чем я говорю, в JavaScript, я ищу более компактный способ, используя только 1предпочтительно выражение regex.

Вот то, что я успешно работаю.

//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]) || "*";

Я только ищу поддержку селекторов css 2.0, которые на 100% поддерживаются Internet Explorer 7.

Например, + selector и: first-child селекторы статичны в ie7, и поэтому мне не нужно их поддерживать.Вот список селекторов css, которые должны работать.

#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]

Редактировать: я закончил использовать этот скрипт.Он даже учитывает универсальный селектор

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

1 Ответ

1 голос
/ 23 октября 2010

Материал в начале селектора должен быть достаточно простым, чтобы удалить его в качестве последнего шага, поэтому давайте сосредоточимся на удалении двух типов мусора с конца в первую очередь. Это вещи в квадратных скобках и вещи, следующие за . или #.

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

То есть удалите все, что заключено в квадратные скобки (во всем выражении; это нормально, если он перехватывает данные раньше), а затем аналогично для селекторов . и #.

Затем, наконец, удалите все, что приводит к не алфавитно-цифровому символу, который охватывает пробелы, > и так далее. Это оставит только последнее «слово» (в данном случае имя тега) в строке:

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

jsFiddle, чтобы попробовать это: http://jsfiddle.net/JAA98/

...