【问题标题】:javascript - Break search query string into objectjavascript - 将搜索查询字符串分解为对象
【发布时间】:2017-09-03 14:54:57
【问题描述】:

我正在尝试通过将搜索字段中的用户输入分解为对象来在客户端构建 api 查询。

例如, 搜索查询

arg1:"2 words" business corporate arg2:val2

期望值

{
    arg1: "2 words",
    arg2: "val2",
    extra: "business corporate"
}

我试过这样做。

var query = initquery.split(' ');
var obj = {};
for(var i=0; i<query.length; i++){
    var s = query[i].split(':');
    if(s.length == 2) {
        initquery = initquery.replace(query[i], '');
        obj[s[0]] = s[1];
    }
}
obj.extra = initquery;

这不处理引号中的字符串。

【问题讨论】:

  • 字符串里面会不会只有arg1和arg2?或者其他 arg{i}:val{i} 也是可能的?
  • 是的,其他参数也是可能的。
  • Stack Overflow 要求您自己完成工作。发布问题是不够的。编写代码并提出相关问题。
  • 这不是重点。关键是你没有工作。你来这里是为了获取复制粘贴代码。你来这里是为了水蛭,不是为了学习。
  • 您需要使用.*? 使其不贪婪。并且未引用的情况应使用\w*,因此它会在到达单词末尾时停止。

标签: javascript regex


【解决方案1】:

你可能想看看这个:

addEventListener('load', function(){

var wtf = 'arg1:"2 words" business corporate arg2:val2 arg3:"fixedIt"';
function customObj(string){
  var a = string.split(/\s+(?!\w+")/), x = [], o = {};
  for(var i=0,s,k,l=a.length; i<l; i++){
    s = a[i].split(/:/); k = s[0];
    s[1] ? o[k] = s[1].replace(/"/g, '') : x.push(k);
  }
  o['extra'] = x.join(' ');
  return o;
}
console.log(customObj(wtf));

});

【讨论】:

  • 感谢@PHPglue,在初始测试中工作正常。将测试更多用例并通知您。
  • arg1:"2 words" business corporate arg2:val2 arg3:"notCatching"
  • 我想我修好了?
  • @PHPglue:是的,这次我没能打破它!不错的正则表达式!
  • 其实我发现了另一个小问题。但我真的认为 OP 的工作是制定一套明确的要求,以便人们知道他们在处理什么。无论如何,查询 arg1:"2 words" business:corporate arg2:val2 会破坏您的代码。
【解决方案2】:

感谢@Barmar 提供this helpful comment,我想出了这个正则表达式来捕获args(假设它们后跟一个数字和一个冒号):

var pattern = /((^|\s)arg\d:").*?(?=")"?|(\sarg\d:\w*)/g;

可以通过以下方式提取查询的其余部分:

query.replace(pattern,"");

然后创建最终对象应该很简单。尽管如此,考虑到在查询字符串中使用双引号可能会增加复杂性,您应该考虑为您的应用程序编写解析器。

更新: 更新了正则表达式以匹配字符串的开头,并且仅匹配空格字符后的arg

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多