2013-08-27 27 views
1

這是我一直在努力解決的事情...如何獲取字符串中的參數值?

我們已經從ajax調用獲取了一些數據,結果數據是其他東西之間的一個巨大的字符串與鍵:值數據。例如:

「2R = OK | 2M = 2 row found(s)| V1 = 1,2 |」

是否有可能讓js做類似的事情: var value = someFunction(str,param);

所以,如果我搜索「V1」參數將返回「1,2」

我SQL Server上運行這個無汗,但我與JS奮力解析字符串。

到目前爲止,我能夠通過一個非常簡陋的for循環來做到這一點是這樣的:

var str = "2R=OK|2M=2 row(s) found|V1=1,2|"; 
var param = "V1"; 
var arr = str.split("|"); 
var i = 0; 
var value = ""; 
for(i = 0; i<arr.length; ++i){ 
    if(arr[i].indexOf(param)>-1){ 
     value = arr[i].split("=")[1]; 
    } 
} 
console.log(value); 

,如果我將它放入一個函數它的工作原理,但我不知道是否有做更有效的方法它,也許是一些正則表達式?但我吮吸它。希望有人能爲我發光呢?

謝謝!

回答

1

這應該爲你工作,它的分隔符是可配置的(如果你想分析一個類似的字符串不同的分隔符,你可以通過在分隔符作爲參數):

var parseKeyValue = (function(){ 

    return function(str, search, keyDelim, valueDelim){ 
    keyDelim = quote(keyDelim || '|'); 
    valueDelim = quote(valueDelim || '='); 

    var regexp = new RegExp('(?:^|' + keyDelim + ')' + quote(search) + valueDelim + '(.*?)(?:' + keyDelim + '|$)'); 
    var result = regexp.exec(str); 

    if(result && result.length > 1) 
     return result[1]; 
    }; 

    function quote(str){ 
    return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); 
    } 
})(); 

Quote function borrowed form this answer

使用示例:

var str = "2R=OK|2M=2 row(s) found|V1=1,2|"; 
var param = "V1"; 
parseKeyValue(str, param); // "1,2" 

var str = "2R=OK&2M=2 row(s) found&V1=1,2"; 
var param = "2R"; 
parseKeyValue(str, param, '&'); // "OK" 

var str = 
"2R=>OK\n\ 
2M->2 row(s) found\n\ 
V1->1,2"; 

var param = "2M"; 
parseKeyValue(str, param, '\n', '->'); // "2 row(s) found" 
+0

感謝您的幫助隊友,@大衛擊敗了你,但你的幫助非常感謝! –

+0

好的,對於延遲抱歉,但這是正確的方法來做到這一點,無論字符串中有多少個參數,這個函數都會給你所需的參數值,而不是別的。給你的帽子小貼士@Paulpro你指出我在那裏有一些有趣的東西。 –

2

這似乎爲您的特定用例的工作:

function getValueByKey(haystack, needle) { 
    if (!haystack || !needle) { 
     return false; 
    } 
    else { 
     var re = new RegExp(needle + '=(.+)'); 
     return haystack.match(re)[1]; 
    } 
} 

var str = "2R=OK|2M=2 row(s) found|V1=1,2|", 
    test = getValueByKey(str, 'V1'); 
console.log(test); 

JS Fiddle demo

而且,包括在你的搜索分隔符(爲了防止somethingElseV1匹配爲V1):

function getValueByKey(haystack, needle, separator) { 
    if (!haystack || !needle) { 
     return false; 
    } 
    else { 
     var re = new RegExp('\\' + separator + needle + '=(.+)\\' + separator); 
     return haystack.match(re)[1]; 
    } 
} 

var str = "2R=OK|2M=2 row(s) found|V1=1,2|", 
    test = getValueByKey(str, 'V1', '|'); 
console.log(test); 

JS Fiddle demo

請注意,此方法需要使用new RegExp()構造函數(而不是使用/.../創建正則表達式),以便將變量傳遞到正則表達式中。同樣,因爲我們使用字符串在構造函數中創建正則表達式,所以我們需要雙重轉義需要轉義的字符(在字符串中首先轉義,然後在創建的RegExp中轉義)。

參考文獻:

+0

不錯!謝謝,但有一個小細節,如果searchString是這樣的「2R = OK | 2M = 2行(s)found | V1 = 1,2 | V2 = Test |」我使用你的方法尋找V1值,我得到「1,2 | V2 =測試|」有沒有辦法告訴正則表達式停止尋找管道「|」被發現? –

+0

哦!你打敗了我,第二個就是那個!感謝很多朋友,我欠你一個寒冷的。我需要在正則表達式中變得更好,因爲它可以節省我很多時間和編碼,因爲我可以記住但我不擅長它。感謝您的參考! –

+0

大衛感謝您的幫助,這個功能就我所知可以非常強大但缺乏一些重要的細節,即只返回給定參數的值,實際上它查找參數並獲取它的值,但也返回找到參數的其餘部分。你發佈的鏈接是一個很大的幫助,非常感謝,但@保羅的方法是一旦我掌握了所有這些正則表達式的甜頭,我將在我的實用程序文件中實施一些調整。謝謝! –

0

Here是另一種方法:

HTML:

<div id="2R"></div> 
<div id="2M"></div> 
<div id="V1"></div> 

的Javascript:

function createDictionary(input) { 
    var splittedInput = input.split(/[=|]/), 
     kvpCount = Math.floor(splittedInput.length/2), 
     i, key, value, 
     dictionary = {}; 

    for (i = 0; i < kvpCount; i += 1) { 
     key = splittedInput[i * 2]; 
     value = splittedInput[i * 2 + 1]; 
     dictionary[key] = value; 
    } 
    return dictionary; 
} 

var input = "2R=OK|2M=2 row(s) found|V1=1,2|", 
    dictionary = createDictionary(input), 
    div2R = document.getElementById("2R"), 
    div2M = document.getElementById("2M"), 
    divV1 = document.getElementById("V1"); 

div2R.innerHTML = dictionary["2R"]; 
div2M.innerHTML = dictionary["2M"]; 
divV1.innerHTML = dictionary["V1"]; 

結果:

OK 
2 row(s) found 
1,2 
+0

有趣的方法,但我認爲處理長字符串時有點慢,在我的情況下,我可以在字符串上接收多達80個參數(不是扇子,而是一個需求),而且你所做的循環與我的初始方法基本相同。感謝隊友提供了一些很酷的提示,你在那裏做的字典非常方便,也許我會爲我自己的這個概念採取一些 –

+0

@SamCcp不客氣:) – kol

相關問題