方案一:
const targetUrl = '/test/info?page={page}&limit={limit}'
const params = {
page: 1,
limit: 10
}
const replace1 = (url, params) => {
let firstIndex = url.indexOf('?');
let resultUrl=url;
if (firstIndex != -1) {
//先取到后面一段
let result = url.slice(firstIndex + 1); // 得到 'page={page}&limit={limit}'
let items = result.split('&'); //得到['page={page}','limit={limit}']
items.forEach(item => {
let dic = item.split('='); // 对于Page来说,得到['page','{page}']
let key=dic[0]; // key的值为 'page'
resultUrl=resultUrl.replace('{'+key+'}',params[key]); //进行替换
});
}
return resultUrl
}
方案二:匹配得到被{}的文本,将其替换成我们的参数。(其实我感觉这个方案才是我们无脑想到的
const regex0=(url,params)=>{
let resultUrl = url;
//就是{}开头结尾来得到数值
// \w+匹配数字和字母下划线的多个字符。也可以写成[\w]+
// [\w+]表示匹配数字、字母、下划线和加号本身字符;
let regex=/\{\w+\}/g
let matter=url.match(regex); // 得到['page={page}','limit={limit}']
console.log(matter);
if(matter && matter.length){
matter.forEach(item=>{
//这里我们知道,我们得到的是包含有{}的字符串.需要将这个符号去掉
let temp = item.slice(1,item.length-1);
console.log(temp);
resultUrl= resultUrl.replace(item,params[temp]);
})
}
return resultUrl;
}
方案三:加上条件原则,再来一个正则(这个感觉就比较舒服…也值得学习)
const regex2=(url,params)=>{
let resultUrl = url;
//以{开头,匹配结果在{之后,以}结尾,匹配结果在}之前
//(?=exp) :定义目标字符串结束位置要求,即紧随目标字符串后面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
//(?<=exp):定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
let regex=/(?<=\{)\w+(?=\})/g
let matter=url.match(regex);
console.log(matter);
if(matter && matter.length){
matter.forEach(item=>{
//这里得到的item,就是去掉{}之后的值
console.log('item='+item);
resultUrl= resultUrl.replace('{'+item+'}',params[item]);
})
}
return resultUrl;
}
方案四:匹配规则更改成不以{开头,用}结尾的字符串
const regex3=(url,params)=>{
let resultUrl = url;
//匹配规则更改成不以{开头,用}结尾的字符串
let regex=/[^{]\w+(?=\})/g
let matter=url.match(regex);
console.log(matter);
if(matter && matter.length){
matter.forEach(item=>{
console.log('item='+item);
resultUrl= resultUrl.replace('{'+item+'}',params[item]);
})
}
return resultUrl;
}