我有以下示例网址:#/reports/12/expense/11
。
我需要在报告之后获取ID - > 12.我在这里问的是最合适的方法。我可以在网址中搜索reports
并在此之后获取内容......但是如果在某个时刻我决定更改网址,我将不得不改变我的算法。
您认为这是最好的方式。一些代码示例也非常有用。
答案 0 :(得分:1)
var text = "#/reports/12/expense/11";
var id = text.match("#/[a-zA-Z]*/([0-9]*)/[a-zA-Z]*/")
console.log(id[1])
正则表达式解释:
答案 1 :(得分:1)
您应该使用正则表达式来查找字符串中的数字。将正则表达式传递给字符串的.match()
方法将返回一个包含基于正则表达式的匹配项的数组。在这种情况下,您感兴趣的返回数组的项目将位于1
的索引处,假设该数字始终位于reports/
之后:
var text = "#/reports/12/expense/11";
var id = text.match(/reports\/(\d+)/);
alert(id[1]);
\d+
这意味着您正在寻找至少一个数字,后跟零到无限数量。
答案 2 :(得分:1)
编写面向未来的代码很难,因为很难预测将来我们可能会做的疯狂事情!
但是,如果我们假设id始终是URL中连续数字的字符串,那么您可以简单地查找:
function getReportId(url) {
var match = url.match(/\d+/);
return (match) ? Number(match[0]) : null;
}
getReportId('#/reports/12/expense/11'); // => 12
getReportId('/some/new/url/report/12'); // => 12
答案 3 :(得分:0)
正则表达式可能很棘手(增加昂贵)。所以通常如果没有它们你可以有效地做同样的事情,你应该这样做。查看您的URL格式,您可能希望至少对其进行一些约束,否则问题将非常复杂。例如,您可能希望假设值始终直接出现在密钥之后,因此在样本报告中= 12和费用= 11,但报告和费用可以切换(例如费用/ 11 /报告/ 12),你会得到相同的结果。
我只想使用字符串split:
var parts = url.split("/");
for(var i = 0; i < parts.length; i++) {
if(parts[i] === "report"){
this.reportValue = parts[i+1];
i+=2;
}
if(parts[i] === "expense"){
this.expenseValue = parts[i+1];
i+=2;
}
}
因此,您的键/值部分可以出现在数组中的任何位置
注意:您还需要检查i + 1是否在parts数组的范围内。但这只会使这个示例代码变得丑陋并且很容易添加。根据您期望(或不期望)的值,您可能还想使用isNaN
检查值是否为数字