直接po代码
function getQueryItems(url){
var reg = /^(?:([A-Za-z]+):)?(?:\/{0,3})([A-Zaz.\-0-9]+)(?::(\d+))?(\/[^#?]*)?(?:\?([^#]*))?(?:#(.*))?$/;
var result = url.match(reg); //result中存储分解下来的结果
console.log(result);
var output = {}; //返回的结果
var item =["scheme","host","port","path","queries","q","p","hash"]; //由于得到的键值对需要单独处理,所以先赋值前四项
for(var i=1;i<5;i++){
output[item[i-1]] = result[i];
}
console.log(output);
//分解键值对
var queries = result[5]; //queries存储得到的键值对
var keyValues = queries.split("&"); //keyValues存储进一步分解结果 ["q=234", "p=abc"]
var querySplit = {}; //存储得到的键和值对象 {q: "234", p:"abc"}
for(var j=0;j<keyValues.length;j++){
querySplit[keyValues[j].split("=")[0]] = keyValues[j].split("=")[1];
}
output["queries"] = querySplit;//将id加到对象中
output["hash"] = result[6];
console.log(output);
}
getQueryItems("https://www.example.com:8080/a/b/c?q=234&p=abc#header");
这个输出会先输出整体的url,然后在输出分解后的。之所以会匹配两遍(先整体在分部),是因为括号的原因,与括号之间的?其实无关。
var reg2 = /[A-Za-z]+:\d+/;
var str = 'https:8080';
console.log(str.match(reg2));
//["https:8080", index: 0, input: "https:8080"]
var reg3 = /([A-Za-z]+)(?::(\d+))?/;
var str1 = 'https:8080';
console.log(str1.match(reg3));
//["https:8080", "https", "8080", index: 0, input: "https:8080"]
你可以自己一个一个把括号去掉试一下。
其他注释都写得很清楚啦,不懂得留言吧。