1. let link = "http://username:password@host:8080/working-tree/xux-js/src/web/tests/test.html?fruit=kiwiFruit&fruit=apricot&fruites=strawberry&fruit=persimmon&fruit=kumquat&fruit=cherry&fruites=pomegranate#large#light";
  2. // 分布提取,繁琐
  3. function linktext(link) {
  4. let linkInfo = {};
  5. linkInfo.protocol = link.match(/^(\w+):\/\//)[1]; // [0] 是整个表达式匹配的结果 [1] 是()捕获的内容 即 http
  6. let userInfo = link.match(/\/\/([^@]+)@/); // [0] 是整个表达式匹配的结果 [1] 是用户信息
  7. linkInfo.username = userInfo ? userInfo[1].split(':')[0] : undefined;
  8. linkInfo.password = userInfo ? userInfo[1].split(':')[1] : undefined;
  9. let yuming = link.match(/:\/\/([^@]+@)?([\w.]+):?(\d+)?\/?/); // [0]是整个表达式匹配的结果 [1] 是用户信息 [2] 是域名 [3] 是端口号 8080
  10. if (!yuming[3]) {
  11. let defaultPortNumber = { http: '80', https: '443' };
  12. yuming[3] = defaultPortNumber[linkInfo.protocol]; // 当端口号为空时,修改为对应域名默认的端口号
  13. }
  14. linkInfo.IP = yuming[2];
  15. linkInfo.port = yuming[3];
  16. let fileNameReg = link.match(/:\/\/[\w\W]+\/([\w.-]+)\??#?[^\/]*$/);
  17. linkInfo.filename = fileNameReg ? fileNameReg[1] : undefined; // [0] 整个表达式匹配的结果 [1] 文件名
  18. let pathReg = link.match(/[\w.]+:?(\d+)?\/([\w-\/]+\/)/); // [0] 整个表达式匹配的结果 [1] 端口号 [2] 虚拟路径
  19. linkInfo.path = pathReg ? fileNameReg ? pathReg[2] + fileNameReg[1] : pathReg[2] : undefined;
  20. let queryReg = link.match(/\?([^#]+)#?/); // [0] 整个表达式匹配的结果 [1] 查询参数
  21. let query;
  22. if (queryReg) {
  23. query = {};
  24. queryReg[1].split('&').forEach(v => {
  25. let res = v.split('=');
  26. // 如果有查询参数,并且查询参数具有相同属性时,将对应参数的值转为数组表示
  27. query[res[0]] = query[res[0]] ? [query[res[0]], res[1]].flat() : res[1];
  28. });
  29. }
  30. linkInfo.query = query;
  31. let fragment = link.match(/#([\w\W]+)$/);
  32. linkInfo.ref = fragment ? fragment[1].split('#') : undefined;
  33. return linkInfo;
  34. }
  35. linktext(link);

正则一时爽

  1. let link = "http://username:password@host:8080/working-tree/xux-js/src/web/tests/test.html?fruit=kiwiFruit&fruit=apricot&fruites=strawberry&fruit=persimmon&fruit=kumquat&fruit=cherry&fruites=pomegranate#large#light";
  2. // 一次提取出全部内容
  3. function linkInfo(link) {
  4. let queryRes = link.match(/^(\w+):\/\/([^@]+@)?([\w.]+):?(\d+)?\/?([\w-\/]+\/)?([\w.-]+)?\??([^#]+)?#?([\w\W]+)?$/),
  5. defaultPortNumber = { http: '80', https: '443' },
  6. query;
  7. if (queryRes[7]) {
  8. query = {};
  9. queryRes[7].split('&').forEach(v => {
  10. let res = v.split('=');
  11. query[res[0]] = query[res[0]] ? [query[res[0]], res[1]].flat() : res[1];
  12. });
  13. }
  14. return {
  15. protocol: queryRes[1],
  16. username: queryRes[2] && queryRes[2].split(':')[0],
  17. password: queryRes[2] && queryRes[2].split(':')[1].replace('@', ''),
  18. IP: queryRes[3],
  19. port: queryRes[4] || defaultPortNumber[queryRes[1]],
  20. path: queryRes[5] + queryRes[6] || '',
  21. filename: queryRes[6],
  22. query: query,
  23. ref: queryRes[8].split('#')
  24. };
  25. }
  26. linkInfo(link)