将字符串与许多模式之一匹配并提取数据
Matching a string to one of many patterns and extracting data
我有一个问题想用 RegEx 或任何其他方法解决,如果有更好的方法的话。我尝试了几种方法来实现目标,但没有任何效果。
我有一个端点数组:
const endpoints = [
{
id: 1,
url: "/api/items/:itemId"
},
{
id: 2,
url: "/api/users/:userName/delete"
},
{
id: 3,
url: "/api/users/:userName/edit"
}
];
还有一个请求URL:
const url = "/api/users/max/edit";
现在我想要的是具有如下功能:
const rewrite = (url, endpoints) => {
// What is the best way to achieve the following return value:
return {
endpointId: 3,
values: {
userName: "max"
}
};
};
说明:该函数应该为 url 找到合适的端点。以冒号开头的端点 url 的所有部分都不是静态的,而是应该替换为请求 url 中的值。在这种情况下,:userName
应替换为 max
。
我从事网络开发已经有一段时间了,但老实说,我几乎不知道如何解决这样的问题。
您可以通过 endpoints
将每个 .url
变成正则表达式来测试 url。
找到匹配项后,只需提取所需部分并使用 属性 名称组成一个对象即可:
<script>
const myEndpoints = [
{
id: 1,
url: "/api/items/:itemId"
},
{
id: 2,
url: "/api/users/:userName/delete"
},
{
id: 3,
url: "/api/users/:userName/edit"
}
];
const myUrl = "/api/users/nermal/edit";
const rewrite = (url, endpoints) => {
for (let i = 0; i < endpoints.length; i++) {
var rep = new RegExp(":(\w+)", "m");
var propName = rep.exec(endpoints[i].url);
var reu = new RegExp(endpoints[i].url.replace(propName[0], "(.*)"));
var a = reu.exec(url);
if (a !== null) {
var x = new Object;
x["endpointId"] = endpoints[i].id;
var y = new Object;
y[propName[1]] = a[1];
x["values"] = y;
return x;
}
}
return null;
};
var q = rewrite(myUrl, myEndpoints);
console.log(q);
console.log(q.values);
</script>
输出:
Object { endpointId: 3, values: {…} }
Object { userName: "nermal" }
const rewrite = (url, endpoints) => {
var doubledArray = Array.prototype.map.call(endpoints, function(el) {
return {
id: el.id,
url: el.url.split('/')
};
});
var parts = url.split('/');
var i = 0;
parts.forEach(function(element) {
doubledArray = doubledArray.filter(el => (element == el.url[i] || el.url[i].startsWith(':')));
i++;
});
return {
endpointId: doubledArray[0].id,
values: {
[`${doubledArray[0].url.filter(el => el.startsWith(':'))[0].substring(1)}`]: parts[doubledArray[0].url.findIndex(function (el) { return el.startsWith(':'); } )],
}
};
};
我有一个问题想用 RegEx 或任何其他方法解决,如果有更好的方法的话。我尝试了几种方法来实现目标,但没有任何效果。
我有一个端点数组:
const endpoints = [
{
id: 1,
url: "/api/items/:itemId"
},
{
id: 2,
url: "/api/users/:userName/delete"
},
{
id: 3,
url: "/api/users/:userName/edit"
}
];
还有一个请求URL:
const url = "/api/users/max/edit";
现在我想要的是具有如下功能:
const rewrite = (url, endpoints) => {
// What is the best way to achieve the following return value:
return {
endpointId: 3,
values: {
userName: "max"
}
};
};
说明:该函数应该为 url 找到合适的端点。以冒号开头的端点 url 的所有部分都不是静态的,而是应该替换为请求 url 中的值。在这种情况下,:userName
应替换为 max
。
我从事网络开发已经有一段时间了,但老实说,我几乎不知道如何解决这样的问题。
您可以通过 endpoints
将每个 .url
变成正则表达式来测试 url。
找到匹配项后,只需提取所需部分并使用 属性 名称组成一个对象即可:
<script>
const myEndpoints = [
{
id: 1,
url: "/api/items/:itemId"
},
{
id: 2,
url: "/api/users/:userName/delete"
},
{
id: 3,
url: "/api/users/:userName/edit"
}
];
const myUrl = "/api/users/nermal/edit";
const rewrite = (url, endpoints) => {
for (let i = 0; i < endpoints.length; i++) {
var rep = new RegExp(":(\w+)", "m");
var propName = rep.exec(endpoints[i].url);
var reu = new RegExp(endpoints[i].url.replace(propName[0], "(.*)"));
var a = reu.exec(url);
if (a !== null) {
var x = new Object;
x["endpointId"] = endpoints[i].id;
var y = new Object;
y[propName[1]] = a[1];
x["values"] = y;
return x;
}
}
return null;
};
var q = rewrite(myUrl, myEndpoints);
console.log(q);
console.log(q.values);
</script>
输出:
Object { endpointId: 3, values: {…} }
Object { userName: "nermal" }
const rewrite = (url, endpoints) => {
var doubledArray = Array.prototype.map.call(endpoints, function(el) {
return {
id: el.id,
url: el.url.split('/')
};
});
var parts = url.split('/');
var i = 0;
parts.forEach(function(element) {
doubledArray = doubledArray.filter(el => (element == el.url[i] || el.url[i].startsWith(':')));
i++;
});
return {
endpointId: doubledArray[0].id,
values: {
[`${doubledArray[0].url.filter(el => el.startsWith(':'))[0].substring(1)}`]: parts[doubledArray[0].url.findIndex(function (el) { return el.startsWith(':'); } )],
}
};
};