2014-08-27 176 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