我有以下示例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