我有以下示例url:#/reports/12/expense/11
。从url获取ID
我需要在报告 - > 12之后得到id。我在这里问的是最合适的方法来做到这一点。我可以在网址中搜索reports
,然后获取内容......但如果在某个时刻我决定更改网址,我将不得不更改我的algorythm。
你认为这里最好的方法是什么?一些代码示例也将非常有用。
我有以下示例url:#/reports/12/expense/11
。从url获取ID
我需要在报告 - > 12之后得到id。我在这里问的是最合适的方法来做到这一点。我可以在网址中搜索reports
,然后获取内容......但如果在某个时刻我决定更改网址,我将不得不更改我的algorythm。
你认为这里最好的方法是什么?一些代码示例也将非常有用。
由于很难预测未来我们可能做的疯狂事情,因此很难编写出符合未来需求的代码!
但是,如果我们假设该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
var text = "#/reports/12/expense/11";
var id = text.match("#/[a-zA-Z]*/([0-9]*)/[a-zA-Z]*/")
console.log(id[1])
正则表达式的解释:
解释在哪里?这应该如何有助于其他人尝试学习一些东西? – 2014-08-27 15:19:05
这基本上允许'“#///”',并返回'“”'。 – SeinopSys 2014-08-27 15:31:52
您应该使用正则表达式查找字符串中的数量相匹配。将正则表达式传递给字符串的.match()
方法将返回包含基于正则表达式的匹配的数组。在这种情况下,返回数组,你有兴趣的项目将是1
的指数,假设该数字将永远是reports/
后:
var text = "#/reports/12/expense/11";
var id = text.match(/reports\/(\d+)/);
alert(id[1]);
\d+
在这里意味着你正在寻找至少有一个数字,后面跟着零到无限多的数字。
正则表达式可能会非常棘手(添加昂贵)。所以通常如果你没有他们就可以有效地做同样的事情。看看你的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;
}
}
所以这样你的键/值的部分可以在阵列中的任何地方出现
注意:您还需要检查我+ 1是零件数组的范围。但是,这只会使这个示例代码变得丑陋,并且很容易添加。根据你期望的值(或不期望值),你可能还想检查一下数值是否为isNaN
“但是如果在某个时刻我决定改变网址,我将不得不改变我的算法。”所以你的问题是:“我怎么从一个字符串中获得一个项目,那个字符串可以是任何东西?”这*是一个棘手的问题。 – aquinas 2014-08-27 15:14:18
不是。例如,Andy的答案是非常好的解决方案。 – Mdb 2014-08-27 15:18:28
但是,如果您决定将URL更改为:/ somethingrandom/notreports/otherstuff/12/somethingelse/11或:11/12/reports/expense,该怎么办?换句话说,我得到的是:当你说你可能会改变网址时,那真的是什么意思? – aquinas 2014-08-27 15:19:25