jQuery中使用了大量的正則表達式,這些正則匯聚了做者們的智慧,值得細心琢磨.
這個正則描述的是url,使用它能夠獲取url中的各個部分(protocol,host,port)html
rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/;
涉及的知識點:jquery
不少文章都在講跨域,到底什麼是跨域呢,看看ajax中是如何判斷跨域的web
if ( s.crossDomain == null ) { parts = rurl.exec( s.url.toLowerCase() ); //使用rurl切割用戶請求的url s.crossDomain = !!( parts && //ajaxLocParts是當前頁面的location.href; ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) ); }
a. 協議不一樣 b. 域名不一樣 c. 端口不一樣ajax
function addDateStamp( url ){ var rts = /([?&])_=[^&]*/ return rts.test( url) ? // If there is already a '_' parameter, set its value url.replace( rts, "$1_=" + new Date().getTime() ) : // Otherwise add one to the end url + ( /\?/.test( url ) ? "&" : "?" ) + "_=" + new Date().getTime(); }
jquery工具函數$.param用於對象序化正則表達式
例如$.param({a : ' '}) -> a=+, 爲何結果是a=+而不是a=空格?由於$.param方法內部使用encodeURIComponent對字符進行編碼,空格通過編碼是%20,而後使用str.replace( /%20/g , "+" )替換%20.算法
爲何要將空格變爲加號呢?w3c中關於 Form content types中要求瀏覽器必須實現 application/x-www-form-urlencoded 和 multipart/form-data編碼規範,二前者明確規定 Space characters are replaced by `+' 傳送門下面是一些網絡參考:chrome
阮一峯的關於URL編碼 跨域
When to encode space to plus (+) or %20?瀏覽器
一個題外話,咱們知道http response有一個contentType響應頭,http request 也能夠設置contentType,你知道嗎?有什麼做用呢?
response header的contentType是告訴瀏覽器,服務器回傳的數據是什麼類型,瀏覽器要如何處理。request header 的contentType天然就是告訴服務器,瀏覽器傳給你的時什麼數據,你應該如何去解碼處理等等。jquery 中ajax也是會默認設置request 的contentType header,1.7.2版本以前的值是application/x-www-form-urlencoded,以後的版本加上了charset=UTF-8。對於使用ajax傳遞中文的狀況,在使用1.7.2以前的版本會出現中文亂碼的狀況。處理的方案也很簡單,就是覆蓋原先的contentType,使用contentType=application/x-www-form-urlencoded;charset=UTF-8。
str.replace(ExpReg , replacementFn )
替換函數的第一個參數表明的是正則的匹配結果,以後的參數對應的是正則中的分組,_1 表明的就是第一個分組(a)的匹配結果。
var regExp = /(a)(b)(c)/; function replacement( _, _1, _2, _3 ){ return _3 + _2 + _1 ; } console.log('abc'.replace(regExp,replacement)); // output: cba
Sizzle函數中有一處代碼,將兩個特殊字符('和\)添加轉義字符\,爲何要作這個事情呢?
$&的值是第一個參數匹配到的結果
sizzle中有一個去除首尾空格的正則
rtrim = /^[\x20\t\r\n\f]+|((?:^|[^\\])(?:\\.)*)[\x20\t\r\n\f]+$/g
((?:^|[^\\])(?:\\.)*)東東是用來幹什麼的,是有什麼特殊狀況須要考慮嗎?
下面的,也可以去掉首尾空格,
/^\s+|\s+$/g
jquery自己也定義了一個去除空格的正則,名字也叫rtrim,可是兩個正則寫法不一樣爲何呢?
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/