摘要:本文主要分析對(duì)象是的源碼中的正則表達(dá)式。表示空白符,包括空格,水平制表符,垂直制表符,換行符,回車(chē)符,換頁(yè)符。
對(duì)于Zepto源碼分析,可以說(shuō)是每個(gè)前端修煉自己js技能的必經(jīng)之路。
當(dāng)然,在讀源碼過(guò)程中,比較難以理解的地方,就是里面出現(xiàn)的各種神奇的正則表達(dá)式。
本文主要分析對(duì)象是[email protected]的源碼中的正則表達(dá)式。
這篇文章,主要總結(jié)了zepto源碼中使用到的一些正則表達(dá)式,分析每個(gè)正則使用場(chǎng)景
關(guān)于正則表達(dá)式學(xué)習(xí),推薦一本不錯(cuò)的書(shū),老姚 大神寫(xiě)的 JavaScript 正則表達(dá)式迷你書(shū),戳里面的鏈接,可以下載pdf版,下面正則解釋都可以從書(shū)中找到對(duì)應(yīng)的位置,如果文中解釋有誤,也以書(shū)為準(zhǔn)。引用書(shū)中強(qiáng)調(diào)的一句話。
正則表達(dá)式是匹配模式,要么匹配字符,要么匹配位置1,fragmentRE = /^s<(w+|!)[ ^>]>/
看源碼位置
匹配目標(biāo)是否為html節(jié)點(diǎn),比如" < html >, < script> 樣的單個(gè)未閉合節(jié)點(diǎn)
可視化形式是:
s* ,貪婪匹配空白符 ,[^>] 表示:匹配到的"<" 和">"中間內(nèi)容不能出現(xiàn)">",中間內(nèi)容出現(xiàn)兩個(gè)分支單詞字符或者!,里面的()進(jìn)行捕獲分組,后面提取第一組的內(nèi)容,下面代碼中,則通過(guò)RegExp.$1 提取。
fragmentRE.test("2,singleTagRE = /^<(w+)s*/?>(?:1>|)$/") && RegExp.$1; // "sccc"
看源碼位置
驗(yàn)證是否為單個(gè)閉合的html標(biāo)簽,形如 “< hr /> ,< script >< /script>”
可視化形式為:
(w+) 分組引用,使用了捕獲分組的概念,Group #1(或者圖中的capture 1) ,為第一組數(shù)據(jù),所以作用在于 后面使用 1提取前面對(duì)應(yīng)的數(shù)據(jù),后面還可以使用 $1,$2 捕獲每組匹配的內(nèi)容。
s表示空白符,包括空格,水平制表符,垂直制表符,換行符,回車(chē)符,換頁(yè)符。
* 表示任意次數(shù)出現(xiàn),
/?則表示 / 出現(xiàn)或者不出現(xiàn)
(?:1>|) 對(duì)應(yīng)的是非捕獲括號(hào),只想要括號(hào)最原始的功能,但不會(huì)引用它,里面的 1,是第一個(gè)分組(Group #1)的內(nèi)容,主要為了驗(yàn)證這個(gè)標(biāo)簽是成對(duì)的,前后內(nèi)容一致。后面|,則表示如果沒(méi)有匹配到成對(duì)的內(nèi)容也可以什么內(nèi)容都沒(méi)有 ,比如 匹配
這類(lèi)標(biāo)簽。
singleTagRE.test("
")&&RegExp.$1 // "hr" singleTagRE.test("")&&RegExp.$1 // "script" singleTagRE.test("最后面的,//ig: 兩個(gè)修飾符 g:表示全局匹配, i表示忽略大小寫(xiě)。
然后再看 正則主體部分內(nèi)容,"< " 和 "/ >"中間的內(nèi)容大致可以分為兩部分:
(?!area|br|col|embed|hr|img|input|link|meta|param)
上面大致可以簡(jiǎn)化成 (?!p),也就是要匹配位置。
要解釋這個(gè),首先要對(duì)應(yīng)的提出(?=p),p 是一個(gè)子模式,指代p前面的位置,也說(shuō)明該位置后面的字符要匹配p.列舉書(shū)中實(shí)例var result = "hello".replace(/(?=l)/g,"#"); console.log(result); // => "he#l#lo"相應(yīng)的開(kāi)頭提到的 (?!p)就是反面意思
var result = "hello".replace(/(?!l)/g,"#"); console.log(result); // => "#h#ell#o#"(?=p) 和 (?!p) 學(xué)名分別是 positive lookahead 和 negative lookahead.
中文翻譯分別是正向先行斷言和負(fù)向先行斷言這里我們可以理解為 #后面的字符串不能匹配l,這里說(shuō)的#,在原字符串"hello"中時(shí)不存在的,只是代表字符之間的各個(gè)位置,輸出#h#ell#o#只是實(shí)例化匹配展示出來(lái)了對(duì)應(yīng)的位置。
<右邊不能是 area,br,col,embed,hr,img,input,link,meta,param,比如像 < img /> ,< br/> 這樣就不需要轉(zhuǎn)化了
var tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([w:]+)[^>]*)/>/ig; "".replace(tagExpanderRE, "<$1>$2>") // 輸出 " "
(([w:]+)[^>]*)
這里使用了捕獲分組,分了兩組(([w:]+)[^>]*) 和 ([w:]+),作用在于,replace的時(shí)候可以通過(guò)$1 和 $2 提取匹配到的數(shù)據(jù)。
([w:]+) 中 + 就是 {1,}的簡(jiǎn)寫(xiě) ,表示w(數(shù)字,字母,下劃線)或者 : 至少出現(xiàn)一次 通常是標(biāo)簽名,div,span 等等
(([w:]+)[^>]*) 多了 [^>]* 表示匹配>以外的任意內(nèi)容,比如 < div class="div-class"> 中的 class="div-class"??梢赃@么理解,比 .*能夠匹配所有內(nèi)容多加了一個(gè)條件var tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([w:]+)[^>]*)/>/ig; "".replace(tagExpanderRE, "<$1>$2>") // 輸出 ""4,rootNodeRE = /^(?:body|html)$/i看源碼位置
通過(guò)檢測(cè)節(jié)點(diǎn)的nodeName屬性,判斷是否為body或者h(yuǎn)tml 根節(jié)點(diǎn)
可視化形式:
var ootNodeRE = /^(?:body|html)$/i; var htmlDom = document.querySelector("html") rootNodeRE.test(htmlDom.nodeName); // 輸出 true; var divDom = document.querySelector("div"); rootNodeRE.test(htmlDom.nodeName); // 輸出 false
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92284.html
摘要:調(diào)用函數(shù),判斷返回的類(lèi)型字符串,就知道是什么數(shù)據(jù)類(lèi)型了判斷是否為瀏覽器的對(duì)象要為對(duì)象首先要滿足的條件是不能為或者,并且為自身的引用。必須存在中必須存在屬性返回的值調(diào)用函數(shù),返回的數(shù)據(jù)類(lèi)型。 數(shù)組方法 定義 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice...
摘要:方法也在讀源碼之內(nèi)部方法有過(guò)分析。不太明白為什么要用全局變量來(lái)接收,用局部變量不是更好點(diǎn)嗎保存當(dāng)前類(lèi)的字符串,使用函數(shù)獲得。這是的依然是全局變量,但是接收的是當(dāng)前元素的當(dāng)前樣式類(lèi)字符串為什么不用局部變量呢。 這篇依然是跟 dom 相關(guān)的方法,側(cè)重點(diǎn)是操作樣式的方法。 讀Zepto源碼系列文章已經(jīng)放到了github上,歡迎star: reading-zepto 源碼版本 本文閱讀的源碼為...
摘要:返回值為,如果能查找到元素,則將元素以數(shù)組的形式返回,否則返回空數(shù)組排除不合法的。的第一個(gè)字符為,并且為標(biāo)簽。如果存在,則查找下選擇器為的所有子元素。正則表達(dá)式為如果沒(méi)有指定標(biāo)簽名,則獲取標(biāo)簽名。包裹元素的即為所需要獲取的。 經(jīng)過(guò)前面三章的鋪墊,這篇終于寫(xiě)到了戲肉。在用 zepto 時(shí),肯定離不開(kāi)這個(gè)神奇的 $ 符號(hào),這篇文章將會(huì)看看 zepto 是如何實(shí)現(xiàn) $ 的。 讀Zepto源碼...
摘要:正則首先看一下其中的正則表達(dá)的正則表達(dá)式要包含在中間。后面可以跟來(lái)表示是否進(jìn)行全局匹配或者不區(qū)分大小寫(xiě)匹配。從句首開(kāi)始匹配是一個(gè),匹配一個(gè)空白字符,包括。 正則 首先看一下其中的正則表達(dá): fragmentRE = /^s*]*>/, singleTagRE = /^(?:|)$/, tagExpanderRE = /]*)/>/ig, rootNodeRE = /^(?:body|h...
摘要:模塊基于上的事件的封裝,利用屬性,封裝出系列事件。這個(gè)判斷需要引入設(shè)備偵測(cè)模塊。然后是監(jiān)測(cè)事件,根據(jù)這三個(gè)事件,可以組合出和事件。其中變量對(duì)象和模塊中的對(duì)象的作用差不多,可以先看看讀源碼之模塊對(duì)模塊的分析。 Gesture 模塊基于 IOS 上的 Gesture 事件的封裝,利用 scale 屬性,封裝出 pinch 系列事件。 讀 Zepto 源碼系列文章已經(jīng)放到了github上,歡...
閱讀 3652·2023-04-26 02:32
閱讀 3966·2021-11-23 10:05
閱讀 2308·2021-10-08 10:04
閱讀 2737·2021-09-22 16:06
閱讀 3630·2021-09-22 15:27
閱讀 780·2019-08-30 15:54
閱讀 1734·2019-08-30 13:50
閱讀 2715·2019-08-29 13:56