1. 程式人生 > >用正則表示式提取Cookie值

用正則表示式提取Cookie值

Cookie是以“;”進行分隔的鍵值對字串,因此如果要提取所以的鍵值,我們需要對字串進行“;”與“=”的split(分割)操作,如下:

function initCookie() {
    var cookie = document.cookie,
        //  第一次分割
        items = cookie.split(";"),
        keys = {};
    items.forEach(function(item) {
        //  第二次分割
        var kv = item.split('=');
        keys[$.trim(kv[0
])] = $.trim(kv[1]); }); return keys; }

從程式碼結構上來看,分割的次數愈多,需要判斷的邏輯就越多,從而堆積了大量的邏輯程式碼,那麼能不能使用正則表示式一次到位呢?

首先從字串的方法來看,search(返回匹配位置)、replace(替換)不滿足需求,match不能進行遞進匹配(lastIndex不會發生遞增),所以字串的所有方法都不合適,從正則表示式的方法來看,exec在結合全域性匹配符使用時,能迴圈遞進元素匹配,正好滿足我們的需求,實現的程式碼如下:

function parseCookie() {
    var cookie = document.cookie,
        pattern = /([^=]+)=([^;]+);?\s*/g
, result, value = {}; while((result = pattern.exec(cookie)) != null) { value[result[1]] = result[2]; } return value; }

與第一種方法相比,減少了空白字元的判斷與去除,並減少了一次匹配(兩次split簡化為一次exec),但是相比與第一種方法,正則表示式的效能遠遠低於字元切割,測試資料見下表。

匹配次數 字元切割(ms) 正則匹配
1 0.51 0.18
10 0.72 0.41
100 1.78 0.84
1000 1.68 0.86

結論

在很多時候,程式碼量雖然變少了,但花費的時間與空間卻有可能大幅增加,同樣在系統架構上,有時擴充套件性、可維護性增強了,但是效能可能有較大的損耗。