代码之家  ›  专栏  ›  技术社区  ›  Lime

提取各种选择器的最后一个标记名

  •  2
  • Lime  · 技术社区  · 14 年前

    基本上,我试图提取几个不同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]) || "*";
    

    例如+选择器和:第一个子选择器在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 回复  |  直到 14 年前
        1
  •  1
  •   VoteyDisciple    14 年前

    作为最后一步,选择器开头的内容应该很容易删除,所以让我们先集中精力从结尾删除这两类垃圾。那是方括号里的东西和后面的东西 . # .

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

    . # 选择器。

    > ,等等。这将只在字符串中留下最后一个“单词”(在本例中是标记名):

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

    一个用于尝试的jsFiddle: http://jsfiddle.net/JAA98/