问答题1064/1593解析url

/**

  • 解析一个url,并生成window.location对象包含的域
  • location:
  • {
  •  href: '包含完整的url',
    
  •  origin: '包含协议到pathname之前的内容',
    
  •  protocol: 'url使用的协议,包含末尾的:',
    
  •  username: '用户名', // 暂时不支持
    
  •  password: '密码',  // 暂时不支持
    
  •  host: '完整主机名,包含:和端口',
    
  •  hostname: '主机名,不包含端口'
    
  •  port: '端口号',
    
  •  pathname: '服务器上访问资源的路径/开头',
    
  •  search: 'query string,?开头',
    
  •  hash: '#开头的fragment identifier'
    
  • }
  • @param {string} url 需要解析的url
  • @return {Object} 包含url信息的对象 */
难度:
2021-07-19 创建

参考答案:

方案一

1function parseUrl(url) { 2 var result = {}; 3 var keys = ['href', 'origin', 'protocol', 'host', 4 'hostname', 'port', 'pathname', 'search', 'hash']; 5 var i, len; 6 var regexp = /(([^:]+:)\/\/(([^:\/\?#]+)(:\d+)?))(\/[^?#]*)?(\?[^#]*)?(#.*)?/; 7 8 var match = regexp.exec(url); 9 console.info('match=', match); 10 11 if (match) { 12 for (i = keys.length - 1; i >= 0; --i) { 13 result[keys[i]] = match[i] ? match[i] : ''; 14 } 15 } 16 console.info('result=', result); 17 return result; 18}

方案二

1function parseURL(url) { 2 //创建一个 a 标签,并将 url 赋值给标签的 href 属性。 3 const a = document.createElement('a') 4 a.href = url 5 return { 6 source: url, 7 protocol: a.protocol.replace(':', ''), // 协议 8 host: a.hostname, // 主机名称 9 port: a.port, // 端口号 10 query: a.search, // 查询字符串 11 params: (function () { // 查询参数 12 let ret = {}, 13 seg = a.search.replace(/^\?/, '').split('&'), 14 len = seg.length, i = 0, s 15 for (; i < len; i++) { 16 if (!seg[i]) { 17 continue 18 } 19 s = seg[i].split('=') 20 ret[s[0]] = decodeURIComponent(s[1]) 21 } 22 return ret 23 })(), 24 file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1], // 文件名 25 hash: a.hash.replace('#', ''), // 哈希参数 26 path: a.pathname.replace(/^([^\/])/, '/$1'), // 路径 27 relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1], // 相对路径 28 segments: a.pathname.replace(/^\//, '').split('/') // 路径片段 29 } 30} 31 32parseUrl("http://test.com:8080?name=1&password=2#page1");

最近更新时间:2021-07-25

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!