在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML5  HTML/ 一個正則問題

一個正則問題

[?&]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, ' '));
  }
回答
編輯回答
柒槿年

key(=([^&#]*)) 可以匹配 key=1 但不能匹配 key=#123 這種情況. 會錯誤的把 #123 當(dāng)做 key 的值

key(=([^&#]*)|&|#|$)就可以處理上述情況.

2018年9月10日 14:32
編輯回答
焚音

很簡單,按照 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 匹配的值的后面,如果還有連接字符串,如 keyq,那么,它的后面是 &;如果已經(jīng)到了 URL 的結(jié)尾,那么它的后面是字符串結(jié)尾界定符 $;還有另一種可能,在 URL 中還包含片段部分,如 https://cn.bing.com/search?q=url&qs=n#name1,那么,當(dāng) keyqs 的時候,它的后面就是 #。

所以,在這個正則表達(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)的值為空。

2018年1月1日 23:31
編輯回答
話寡

標(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

2017年3月20日 05:38