parseUri 1.2:在 JavaScript 中拆分 URL
我剛剛更新了 parseUri。如果您還沒有看過舊版本,則 parseUri 是一個函數,它將任何格式正確的 URI 拆分為其部分,所有這些都是可選的。它的準確性、靈活性和簡潔性是無與倫比的。
亮點:
- 全面拆分 URI,包括將查詢字符串拆分為鍵/值對。 (增強)
- 兩種解析模式:鬆散和嚴格。 (新)
- 易於使用(返回一個對象,所以你可以這樣做,例如,
parseUri(uri).anchor
)。 - 提供方便的預連接組件(路徑 =目錄和文件;權限 =用戶信息、主機和端口等)
- 通過更新
parseUri.options.key
在不編輯函數的情況下更改 URI 部分的默認名稱 . (新) - 非常輕量級(1 KB 之前 縮小或壓縮)。
- 根據 MIT 許可發布。
詳情:
此函數的舊版本使用現在稱為鬆散解析模式(在此版本中仍然是默認設置)。鬆散模式與官方通用 URI 規範 (RFC 3986) 略有不同,但這樣做允許函數以大多數最終用戶直觀期望的方式拆分 URI。然而,鬆散模式的更精細的細節使其無法正確處理不是從根開始的相對路徑(例如,“../file.html”或“dir/file.html”)。另一方面,嚴格模式嘗試根據 RFC 3986 拆分 URI。具體而言,在鬆散模式下,目錄不需要以斜杠結尾(例如,“/dir?query”中的“dir”被視為目錄而不是文件名),並且 URI 可以以權限開頭而不是“//”(這意味著“yahoo.com/search/”中的“yahoo.com”被視為主機,而不是比目錄路徑的一部分)。
由於我假設大多數開發人員始終希望使用一種模式或另一種模式,因此在運行 parseUri
時未將解析模式指定為參數 ,而是作為 parseUri
的屬性 功能本身。只需運行以下代碼行即可切換到嚴格模式:
parseUri.options.strictMode = true;
從那時起,parseUri 將在嚴格模式下工作(直到您將其重新關閉)。
代碼:
// parseUri 1.2.2 // (c) Steven Levithan <stevenlevithan.com> // MIT License function parseUri (str) { var o = parseUri.options, m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), uri = {}, i = 14; while (i--) uri[o.key[i]] = m[i] || ""; uri[o.q.name] = {}; uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { if ($1) uri[o.q.name][$1] = $2; }); return uri; }; parseUri.options = { strictMode: false, key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], q: { name: "queryKey", parser: /(?:^|&)([^&=]*)=?([^&]*)/g }, parser: { strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ } };
你可以在這裡下載。
parseUri 沒有依賴關係,並且已經在 IE 5.5–7、Firefox 2.0.0.4、Opera 9.21、Safari 3.0.1 beta for Windows 和 Swift 0.2 中進行了測試。