1

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

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

“2R=OK|2M=找到 2 行|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);

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

谢谢!

4

3 回答 3

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 小提琴演示

并且,要在搜索中包含分隔符(以防止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 小提琴演示

请注意,这种方法确实需要使用new RegExp()构造函数(而不是使用创建正则表达式文字/.../)才能将变量传递给正则表达式。

同样,因为我们使用字符串在构造函数中创建正则表达式,所以我们需要对需要转义的字符进行双重转义(首先在字符串中转义,然后在创建的 RegExp 中转义)。

参考:

于 2013-08-27T17:32:19.980 回答
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");
  }
})();

引用函数从这个答案中借用

用法示例:

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"
于 2013-08-27T17:36:12.893 回答
0

是另一种方法:

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
于 2013-08-27T17:51:56.533 回答