2014-08-27 125 views
0

我有以下示例url:#/reports/12/expense/11从url获取ID

我需要在报告 - > 12之后得到id。我在这里问的是最合适的方法来做到这一点。我可以在网址中搜索reports,然后获取内容......但如果在某个时刻我决定更改网址,我将不得不更改我的algorythm。

你认为这里最好的方法是什么?一些代码示例也将非常有用。

+0

“但是如果在某个时刻我决定改变网址,我将不得不改变我的算法。”所以你的问题是:“我怎么从一个字符串中获得一个项目,那个字符串可以是任何东西?”这*是一个棘手的问题。 – aquinas 2014-08-27 15:14:18

+0

不是。例如,Andy的答案是非常好的解决方案。 – Mdb 2014-08-27 15:18:28

+0

但是,如果您决定将URL更改为:/ somethingrandom/notreports/otherstuff/12/somethingelse/11或:11/12/reports/expense,该怎么办?换句话说,我得到的是:当你说你可能会改变网址时,那真的是什么意思? – aquinas 2014-08-27 15:19:25

回答

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 
1
var text = "#/reports/12/expense/11"; 
var id = text.match("#/[a-zA-Z]*/([0-9]*)/[a-zA-Z]*/") 
console.log(id[1]) 

正则表达式的解释:

  • #/匹配字符#/字面上
  • [A-ZA-Z] * - 相匹配的字
  • /字符匹配/字面上
  • 第一捕获组 - ([0-9] *) - 这与一个数字匹配。
  • [A-ZA-Z] * - 匹配一个单词
  • /字符/字面上
+0

解释在哪里?这应该如何有助于其他人尝试学习一些东西? – 2014-08-27 15:19:05

+0

这基本上允许'“#///”',并返回'“”'。 – SeinopSys 2014-08-27 15:31:52

1

您应该使用正则表达式查找字符串中的数量相匹配。将正则表达式传递给字符串的.match()方法将返回包含基于正则表达式的匹配的数组。在这种情况下,返回数组,你有兴趣的项目将是1的指数,假设该数字将永远是reports/后:

var text = "#/reports/12/expense/11"; 
var id = text.match(/reports\/(\d+)/); 
alert(id[1]); 

\d+在这里意味着你正在寻找至少有一个数字,后面跟着零到无限多的数字。

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; 
    } 
} 

所以这样你的键/值的部分可以在阵列中的任何地方出现

注意:您还需要检查我+ 1是零件数组的范围。但是,这只会使这个示例代码变得丑陋,并且很容易添加。根据你期望的值(或不期望值),你可能还想检查一下数值是否为isNaN