如何在字符串中获取参数值?

时间:2013-08-27 17:25:15

标签: javascript

这是我一直试图解决的问题......

我们从ajax调用获得了一些数据,结果数据在其他东西之间是一个巨大的字符串和key:value数据。例如:

“2R = OK | 2M =找到2行| V1 = 1,2 |”

js可以执行以下操作: var value = someFunction(str,param);

所以如果我搜索“V1”参数,它将返回“1,2”

我在Sql服务器上运行没有出汗,但我正在努力用js来解析字符串。

到目前为止,我能够通过这样一个非常简陋的循环来做到这一点:

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

如果我把它放到一个函数中它可以工作,但我想知道是否有更有效的方法来做,也许一些正则表达式?但我很沮丧。希望有人可以为我发光吗?

谢谢!

3 个答案:

答案 0 :(得分: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中转义)。 / p>

参考文献:

答案 1 :(得分: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"

答案 2 :(得分: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