何時,紗窗外,風(fēng)搖翠竹

          常用鏈接

          統(tǒng)計

          最新評論

          • 1.?re: 慎用AJAX框架
          • AJAX是中國技術(shù)領(lǐng)域的紅燈區(qū)。。想爽,但又怕潛伏著危險。。。
          • --阿斯頓飛
          • 2.?re: 慎用AJAX框架
          • 評論內(nèi)容較長,點擊標題查看
          • --夏如嘏
          • 3.?re: 慎用AJAX框架
          • ajax 要懂的原理,同意樓主,框架慎用
          • --驕傲
          • 4.?re: 慎用AJAX框架
          • @讀書、思考、生活
            2、bug滿天飛,那就說明是水平不到家
            您的水平能高到?jīng)]有bug?
          • --樓主
          • 5.?re: 慎用AJAX框架
          • 只要你懂xmlhttp,為什么非要用ajax呢,我從2000年開始使用xmlhttp,ajax剛出來的時候看了一眼,冷笑一聲。所以爭論沒有意義,到處都是新瓶裝老酒的故事
          • --挨踢的貨

          一條JS正則表達式效率分析及優(yōu)化

          ??? 前幾天遇到一個bug,在一個填email的文本框,當(dāng)用戶錄入比較長的一段文本后(比如40位以上),頁面就死掉了。檢查后發(fā)現(xiàn)校驗Email的是下面這樣一段javascript代碼:

          ? function checkEmail(email)
          ? {
          ??????? if (email.length == 0 )
          ??????????? return true;
          ???????? var validEmail = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
          ???????? if (validEmail.test(email))
          ???????? {
          ???????????????? return true
          ????????? }
          ?????????? return false
          ??? }

          ??? checkEmail("123456789012345678901234567890123456789012345abcdefghijkl");

          ?? 第一反應(yīng)是正則表達式寫的有問題,'@'前后的 ([\.-]?\w+)* 都可能會引起效率問題。下面仔細分析一下:

          1. 從輸入的值來看, engine會首先匹配 \w+, 這是一個貪婪匹配,可以一直匹配到結(jié)尾;
          2. 然后按優(yōu)先級開始匹配 ([\.-]?\w+)*中的 [\.-]?\w+,這個時候前面的 \w+ 為了后面的匹配成功,必須要重現(xiàn)匹配,讓出一點匹配的內(nèi)容,假設(shè)先讓出的是 'l',([\.-]?\w+)*匹配成功;
          3. ([\.-]?\w+)* 意味著要盡量去匹配多次,再第二次對 [\.-]?\w+ 匹配,這個時候為了第二次匹配的成功,第一次匹配的 [\.-]?\w+ 要讓出能滿足第二次 [\.-]?\w+ 的內(nèi)容,也就是它匹配到的'l',這個時候,第一次匹配的 [\.-]?\w+ 又不滿足了,\w+ 又得讓出來一個'k'。
          4. 這樣未知匹配次數(shù)的 ([\.-]?\w+)* 就形成了一個很大的循環(huán),而在正則表達式中,每次匹配時被括號里模式匹配的東西都是要被存起來供以后使用的,大量的中間結(jié)果被緩存,最終導(dǎo)致IE死掉。

          ?? 所以這是一條典型的因為循環(huán)嘗試匹配導(dǎo)致效率低下的正則表達式, 表達式中兩個 ([\.-]?\w+)* 都可能導(dǎo)致解釋器的crash,在本例中不需要利用匹配的中間結(jié)果,所以解決的辦法很簡單,在括號加入一個冒號,不保存中間結(jié)果就是了。即將那個正則表達式改成如下:

          ? /^\w+(?:[\.-]?\w+)*@\w+(?:[\.-]?\w+)*(\.\w{2,3})+$/

          如果性能還是不能滿足需求,可以考慮把這個正則表達式拆成幾個小的表達式,分別進行驗證。

          posted on 2006-08-17 20:50 weidy 閱讀(1779) 評論(0)  編輯  收藏 所屬分類: WEB & AJAX

          主站蜘蛛池模板: 剑川县| 手机| 施甸县| 道孚县| 迁安市| 东宁县| 集安市| 伊宁县| 治多县| 千阳县| 博白县| 遂川县| 肥乡县| 天气| 肇庆市| 集贤县| 营山县| 大庆市| 芦山县| 化隆| 象山县| 镇巴县| 读书| 望奎县| 平南县| 白水县| 中卫市| 游戏| 白沙| 新巴尔虎左旗| 荆门市| 凭祥市| 延川县| 福贡县| 楚雄市| 长沙县| 和龙市| 巴林右旗| 清水县| 云龙县| 天长市|