日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常见面试题 - URL 解析

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见面试题 - URL 解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源自之前面試的時候頻繁要求手寫 url parse ,故針對此種情況專門寫一文來簡述如何解析 URL ,如果您有更好的解析方法或題型變種歡迎討論

注意,本文僅討論開頭所列出的一種格式,尚未討論 URL 的更多格式,更多符合規范的格式(如使用相對路徑等的情況)詳見:tools.ietf.org/html/rfc398…

URL 是啥樣的

首先讓我們看看一種完整的 URL 是長什么樣的: <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

如果這樣太抽象了,那么我們舉個例子具體化一下: https://juanni:miao@www.foo.com:8080/file;foo=1;bar=2?test=3&miao=4#test

組件描述默認值
scheme訪問服務器獲取資源時使用的協議https
user訪問資源時使用的用戶名無(匿名)juanni
password用戶的密碼,和用戶名使用:分割E-mailmiao
host資源服務器主機名或IP地址www.foo.com
port資源服務器監聽的端口,不同的scheme有不同的默認端口(HTTP使用80作為默認端口)和scheme有關8080
path服務器上的資源路徑。路徑與服務器和scheme有關默認值/file
params在某些scheme下指定輸入參數,是鍵值對。可以有多個,使用;分割,單個內的多個值使用, 分割默認值foo=1;bar=2
query該組件沒有通用的格式,HTTP中打多使用&來分隔多個query。使用?分隔query和其他部分test=3&miao=4
frag/fragment一小片或一部分資源名稱。引用對象時,不會將fragment傳送給服務器,客戶端內部使用。通過#分隔fragment和其余部分test

由于 path parameter 是 path 的一部分,因此我們將其歸為 path 中

同時,如果要表示哪些部分是可選的,則可以表示為: [scheme:]//[user[:password]@]host[:port][/path][?query][#fragment]

如何獲取每個組件

我們先不考慮組件內部的數據,先獲取每個組件

讓瀏覽器幫我們解析 - URLUtils

先介紹一個偷懶的方式: URLUtils ,可以通過該接口獲取 href 、 hostname 、 port 等屬性。

在瀏覽器環境中,我們的 a 標簽,也就是 HTMLAnchorElement 實現了 URLUtils 中定義的屬性,那么就可以用如下代碼獲得每個組件了

/*** @param {string} url* 利用 URLUtils 簡單解析 URL* @returns {protocol, username, password, hostname, port, pathname, search, hash}*/ function URLParser(url) {const a = document.createElement('a');a.href = url;return {protocol: a.protocol,username: a.username,password: a.password,hostname: a.hostname, // host 可能包括 port, hostname 不包括port: a.port,pathname: a.pathname,search: a.search,hash: a.hash,} } 復制代碼

缺點:

  • 依賴瀏覽器宿主環境接口

使用 URL 對象

上面使用 a 標簽的方法在 Node 環境中就失效了,但是我們還有其他方法可以讓底層 API 幫我們解析 —— URL

/*** @param {string} url* 利用 URLUtils 簡單解析 URL* @returns {protocol, username, password, hostname, port, pathname, search, hash}*/ function URLParser(url) {const urlObj = new URL(url);return {protocol: urlObj.protocol,username: urlObj.username,password: urlObj.password,hostname: urlObj.hostname,port: urlObj.port,pathname: urlObj.pathname,search: urlObj.search,hash: urlObj.hash,} } 復制代碼

老老實實手擼一個

那要是面試官要老老實實的手擼,那也只能對著擼了:

function parseUrl(url) {var pattern = RegExp("^(?:([^/?#]+))?//(?:([^:]*)(?::?(.*))@)?(?:([^/?#:]*):?([0-9]+)?)?([^?#]*)(\\?(?:[^#]*))?(#(?:.*))?");var matches = url.match(pattern) || [];return {protocol: matches[1],username: matches[2],password: matches[3],hostname: matches[4],port: matches[5],pathname: matches[6],search: matches[7],hash: matches[8]}; } parseUrl("https://juanni:miao@www.foo.com:8080/file;foo=1;bar=2?test=3&miao=4#test") // hash: "#test" // hostname: "www.foo.com" // password: "miao" // pathname: "/file;foo=1;bar=2" // port: "8080" // protocol: "https:" // search: "?test=3&miao=4" // username: "juanni" 復制代碼

這個正則確實有點難懂,不過相信有一些基礎的話加上下面兩張圖還是可以理解:

解析 search(query) 部分

偷懶使用 URLSearchParams

/*** @param {string} search 類似于 location.search* @returns {object}*/ function getUrlQueyr(search) {const searchObj = {};for (let [key, value] of new URLSearchParams(search)) {searchObj[key] = value;}return searchObj; } 復制代碼

優點:

  • 不需要手動使用 decodeURIComponent
  • 會幫著把 query 上的 + 自動轉換為空格(單獨使用 decodeURIComponent 做不到這點)(至于什么情況把 空格 轉換為 + ,什么情況把空格轉換為 %20,可以參考這里等)
  • 不支持如 array[] / obj{} 等形式

再手擼一個(殘缺版)

要求:

  • 對于非法字符不予解析
  • 對于形如 list[] 的解析成數組
  • 對于形如 obj{} 的解析為對象(暫時只需要用 JSON.parse 進行解析)
/*** @param {string} query 形如 location.search* @returns {object}*/ function parseQueryString(query) {if (!query) {return {};}query = query.replace(/^\?/, '');const queryArr = query.split('&');const result = {};queryArr.forEach(query => {let [key, value] = query.split('=');try {value = decodeURIComponent(value || '').replace(/\+/g, ' ');key = decodeURIComponent(key || '').replace(/\+/g, ' ');} catch (e) {// 非法console.log(e);return;}const type = getQuertType(key);switch(type) {case 'ARRAY':key = key.replace(/\[\]$/, '')if (!result[key]) {result[key] = [value];} else {result[key].push(value);}break;case 'JSON': key = key.replace(/\{\}$/, '')value = JSON.parse(value);result.json = value;break;default:result[key] = value;}});return result;function getQuertType (key) {if (key.endsWith('[]')) return 'ARRAY';if (key.endsWith('{}')) return 'JSON';return 'DEFAULT';} }const testUrl = '?name=coder&age=20&callback=https%3A%2F%2Fmiaolegemi.com%3Fname%3Dtest&list[]=a&list[]=b&json{}=%7B%22str%22%3A%22abc%22,%22num%22%3A123%7D&illegal=C%9E5%H__a100373__b4' parseQueryString(testUrl) 復制代碼

當然,這里還并不嚴謹,沒有考慮到如下問題

  • 相同字段如何處理
  • 沒有替換 + 為
  • 只有 key
  • 只有 value
  • 沒有解析相對路徑
  • 更深入的解析 Object
  • 最后,這里推薦一個開源庫:url-parse,對各種情況處理的比較好,同時這也意味著實現上略復雜,理解即可,面試中更需結合充分理解面試官要求進行解答與擴展

    參考

    • 【讀】這一次,讓我們再深入一點 - URL你是否真的了解?
    • path-parameter-syntax
    • URLUtils
    • URL
    • URLSearchParams

    總結

    以上是生活随笔為你收集整理的常见面试题 - URL 解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产91久 | 国产黄色片视频 | 美女网站黄频 | 三级视频网 | jizz黄| 蜜桃久久久久久 | 中文视频在线观看 | 九九热在线播放 | 自拍第二页| 精品熟妇视频一区二区三区 | 夜夜骑天天干 | 专干老肥女人88av | 污视频在线观看网站 | 华丽的外出在线观看 | 国产男人搡女人免费视频 | 欧美一区二区二区 | 久久久久久久亚洲av无码 | 91情侣在线 | 久久国产色av免费观看 | 超碰免费在线观看 | 天天操夜夜拍 | 久久国产精品久久久久久电车 | 亚洲精品乱码久久久久久写真 | 国产精品久久久不卡 | 欧美黄色大片免费观看 | 色综合久久久无码中文字幕波多 | 成人动漫在线播放 | 成人黄色录像 | 久久久久久久久久一区 | 日本高清视频www | 国产一区二区三区精品视频 | 亚洲成在线 | 欧美成人vr18sexvr | 欧美一级做性受免费大片免费 | 视频一区二区三区在线观看 | 美女隐私黄www网站动漫 | 日本爱爱免费视频 | 欧美射射 | 欧美变态口味重另类在线视频 | 国产cao | 91丨porny丨国产入口 | 樱空桃在线观看 | 名校风暴在线观看免费高清完整 | 干干干日日日 | 久久9久久 | 一级特黄a大片免费 | 国产区一二三 | 精品亚洲中文字幕 | 欧美一区二区三区成人片在线 | 含羞草一区二区三区 | 国产区一二 | 成人黄色一级视频 | 国产精品国产三级国产专播精品人 | av老司机福利 | 欧美sm凌虐视频网站 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品视频大全 | 国产美女无遮挡免费 | 国产老头老太作爱视频 | 国产精品高潮呻吟久久av野狼 | 亚洲精品无码久久久久久久 | 美女脱了裤子让男人桶 | 中文字幕免费一区 | 免费视频一区 | 欧美综合一区 | 贝利弗山的秘密在线观看 | 久久天堂影院 | 99这里都是精品 | 欧美一级一片 | 草草久久久无码国产专区 | 网爆门在线 | 就去色综合 | 自拍偷拍1| 在线视频欧美日韩 | 玖玖在线观看 | 午夜久久久久久久久 | 女上男下动态图 | 欧美精品123区| 一级黄色在线视频 | 99色图| 少妇av一区二区三区无码 | 久久露脸 | 午夜精品亚洲 | 销魂奶水汁系列小说 | 午夜精品久久久久久久爽 | 一级片在线免费观看视频 | 精品人妻一区二区三区蜜桃视频 | 天堂√| 日本激情一区二区 | 学生孕妇videosex性欧美 | 色综合欧美 | 日韩成人高清视频 | 久射久| 欧美日韩大片在线观看 | 色婷综合| 亚洲男女一区二区三区 | 特级西西www444人体聚色 | 青青青青草 | 日韩人妻无码精品久久久不卡 |