[?&]key(=([^&#]*)|&|#|$)
這段匹配 url 查詢參數(shù)的正則,后面的 |&|#|$ 是什么意思?我把它去掉也可以匹配成功
來源
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
很簡單,按照 URL 的結(jié)構(gòu),需要查詢的 key 在查詢字符串中,除去 URL 前面的協(xié)議、用戶、密碼、主機(jī)地址、端口外,還剩下查詢字符串和片段。
查詢字符串的格式以 ? 標(biāo)志開始,多個查詢字符串之間以 & 進(jìn)行連接。在查詢字符串后,可能還有片段部分,片段部分的結(jié)構(gòu)為 #xxx。
下面解釋一下這個正則表達(dá)式:[?&]key(=([^&#]*)|&|#|$)
對于 URL https://cn.bing.com/search?q=url&qs=n
先判斷 key 前面的內(nèi)容。 key 可能是第一個查詢字符串 q,對應(yīng) q=url,那么它前面就是查詢字符串開始的標(biāo)志 ?;如果 key 不是第一個查詢字符串,是 qs,對應(yīng) qs=n,那么它前面必是查詢字符串的連接符 &。
而在 key 匹配的值的后面,如果還有連接字符串,如 key 為 q,那么,它的后面是 &;如果已經(jīng)到了 URL 的結(jié)尾,那么它的后面是字符串結(jié)尾界定符 $;還有另一種可能,在 URL 中還包含片段部分,如 https://cn.bing.com/search?q=url&qs=n#name1,那么,當(dāng) key 是 qs 的時候,它的后面就是 #。
所以,在這個正則表達(dá)式中,[?&] 表示 key 之前可能出現(xiàn)的內(nèi)容,在 key 對應(yīng)的值的部分,絕不可能出現(xiàn)的字符為 & 和 #,所以匹配時使用 [^&#] 表示匹配 & 和 # 之外的內(nèi)容,&|#|$ 表示 key 對應(yīng)的值之后可能出現(xiàn)的內(nèi)容。
還要注意的是在表示匹配的值的 ([^&#]*) 也在 | 的作用范圍內(nèi),說明值可有可無,這樣可以匹配 https://cn.bing.com/search/q= 這樣特殊的 URL,得到 key 對應(yīng)的值為空。
標(biāo)簽選了這么多。不知道你用的是什么語言。
我說下在JavaScript中正則的|是指或。
也就是說|&|#|$指匹配以&或#結(jié)尾(這里的$指結(jié)尾)。
推薦一個網(wǎng)址在線正則測試工具 選擇JavaScript
規(guī)則:
[?&]name(=([^&#]*)|&|#|$)
測試字符串:
http://element-cn.eleme.io/1.4?name=1&name=2$&name=3&name=&name&&name#/zh-CN/guide/design
這樣更有體會。
可能會有一些& #結(jié)尾的不是常規(guī)的URL。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。