選取器切割正則的進化

來源:互聯網
上載者:User
  • //標籤,ID 類 偽類 屬性的標識符 它們的主體部分,親子相鄰兄長並聯萬用字元,空白var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:\[][\w\(\)\]]+|\s*[>+~,*]\s*|\s+/g        
  • //讓小括弧裡面的東西不被切割var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:\[](?:[\w\u00a1-\uFFFF-]|\([^\)]*\)|\])+|(?:\s*)[>+~,*](?:\s*)|\s+/g        
  • //確保屬性選取器作為一個完整的詞素var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S*\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s+/g        
  • //縮小後代選取器的範圍var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S+\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])/g        
  • 解決左邊沒用的空白字串

            var reg_split = /^\s+|[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S+\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s+(?=[\w\u00a1-\uFFFF*#.[:])/g;        var selectors = "  [aaa=99] > dfdsf ,ggg   eee  iii ";        // var selectors = "  [aaa=eee] jjjj"        // var selectors = " p span"        var array = [],i=0,ri=0        selectors.replace(reg_split,function(selector){          if(selector == false){//如果為空白字串            i++ && (array[ri++] = " ");//並且並不是第一個捕獲的          }else if(selector.match(/^\s*([>+~,*])\s*$/)){            array[ri++] = RegExp.$1;          }else {            array[ri++] = selector;          }        });        alert("|"+array.join("|"));
  • 修正無用空白字元的判定與偽類別選取器的匹配正則

        var reg_split =/^\s+|[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:][\w\u00a1-\uFFFF-]+(?:\([^\)]*\))?|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])/g;        var selectors = "  div:eq(0) ";        var parts = [],i=0,ri=0         selectors.replace(reg_split,function(part){            i++            if(part == false ){//如果為空白字串                if(i)                    parts[ri++] = " ";//並且並不是第一個捕獲的            }else if(part.match(/^\s*([>+~,*])\s*$/)){                parts[ri++] = RegExp.$1;            }else {                parts[ri++] = part;            }        });
var reg_split = /^[\w\u00a1-\uFFFF\-\*]+|[#.:][\w\u00a1-\uFFFF-]+(?:\([^\)]*\))?|\[[^\]]*\]|(?:\s*)[>+~,](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])|^\s+/;var slim = /\s+|\s*[>+~,*]\s*$/function spliter(expr) {    var flag_break = false;    var full = [];//這裡放置切割單個選取器群組得到的詞素,以“,”為界    var parts = [];//這裡放置切割單個選取器組得到的詞素,以關係選取器為界    do {        expr = expr.replace(reg_split, function(part) {            if (part === ",") {//這個切割器只處理到第一個並聯選取器                flag_break = true;            } else {                if (part.match(slim)) {//對關係,並聯,通符符選取器兩邊的空白進行處理                    //對parts進行反轉,因為div.aaa,反轉後先處理.aaa                    full = full.concat(parts.reverse(), part.replace(/\s/g, ''));                    parts = [];                } else {                    parts[parts.length] = part;                }            }            return "";//去掉已經處理了的部分        });        if (flag_break)            break;    } while (expr)    full = full.concat(parts.reverse());    !full[0] && full.shift();//去掉開頭第一個空白    return full;}var expr = "  div  >  div#aaa,span"console.log(spliter(expr));//["div",">","#aaa", "div"] 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.