【问题标题】:How to extract values from a string in javascript?如何从javascript中的字符串中提取值?
【发布时间】:2011-11-13 21:38:13
【问题描述】:

我需要一些帮助来使用 javascript 从 cookie 中提取值。

cookie 中的字符串如下所示:

string = 'id=1||price=500||name=Item name||shipping=0||quantity=2++id=2||price=1500||name=Some other name||shipping=10||quantity=2'

通过使用 string.split() 和 string.replace() 以及一些难看的代码,我设法获得了我需要的值(价格、名称、运输、数量)。但问题是,有时 cookie 中的所有字符串并非都相同。有时 cookie 中的刺痛看起来像这样:

   string = 'id=c1||color=red||size=XL||price=500||name=Item name||shipping=0||quantity=2++id=c1||price=500||name=Item name||shipping=0||quantity=2'

有些项目以颜色和大小作为参数,有时只有其中之一。

有没有更有效的方法来向我的计算机解释我希望在 'price=' 之后的字符串部分是一个名为 'price' 等的变量。

我希望我能说得通,我尽量做到精确。

不管怎样,谢谢你的帮助

编辑:我只想对 StackOverflow 的所有伟大人物表示感谢,感谢他们提出了如此美妙的想法。因为你所有的好建议,我今晚要出去喝醉。谢谢大家:)

【问题讨论】:

  • 我想大多数人都忽略了这样一个事实,即您的字符串中有 2 条记录由 ++ 分隔。你怎么处理这个?您只想要第一个价格/名称/等吗?还是两者兼而有之?

标签: javascript jquery string cookies


【解决方案1】:

如果您可以将|| 替换为&,您可以尝试使用parse it as if it were a query string。 个人说明 - JSON 格式的数据会更容易处理。

【讨论】:

    【解决方案2】:

    我会将数据附加到一个 javascript 对象。

      var settingsObj = {};
      var components = thatString.split('||');
    
      for(var j = 0; j < components.length; j++)
      {
           var keyValue = components[j].split('=');
    
           settingsObj[keyValue[0]] = keyValue[1];
      }
    
      // Now the key value pairs have been set, you can simply request them
    
      var id = settingsObj.id; // 1 or c1
      var name = settingsObj.name; // Item Name, etc
    

    【讨论】:

      【解决方案3】:

      您已经在使用 .split() 通过 || 来分解字符串只需更进一步,将每个部分按 = 拆分,并将左侧的所有内容分配给字段,将右侧的所有内容分配给值

      【讨论】:

        【解决方案4】:

        这应该得到字符串中的第一个匹配项:

        string.match(/price=(\d{1,})/)[1]
        

        请注意,这只会匹配字符串中的第一个 price=,而不是第二个。

        【讨论】:

          【解决方案5】:

          让我们写一个解析器!

          function parse(input)
          {
              function parseSingle(input)
              {
                  var parts = input.split('||'),
                      part,
                      record = {};
          
                  for (var i=0; i<parts.length; i++)
                  {
                      part = parts[i].split('=');
                      record[part[0]] = part[1];
                  }
          
                  return record;
              }
          
              var parts = input.split('++'),
                  records = [];
          
              for (var i=0; i<parts.length; i++)
              {
                  records.push(parseSingle(parts[i]));
              }
          
              return records;
          }
          

          用法:

          var string = 'id=1||price=500||name=Item name||shipping=0||quantity=2++id=2||price=1500||name=Some other name||shipping=10||quantity=2';
          
          var parsed = parse(string);
          /* parsed is:
          [{id: "1", price: "500", name: "Item name", shipping: "0", quantity: "2"},
           {id: "2", price: "1500", name: "Some other name",  shipping: "10", quantity: "2"}]
          */
          

          【讨论】:

          • 你是否错过了那里有 2 条记录,由++分隔的事实
          • @Jamiec 和 @Michael 谢谢,我错过了 ++ 应该分隔 2 条记录。立即编辑。
          • @Jamiec @Michael 已修复。再次感谢:)
          • 如果您需要肾脏或其他什么,请给我打电话,我会看看我能做些什么:),非常感谢
          【解决方案6】:

          试试看:

          var string = 'id=1||price=500||name=Item name||shipping=0||quantity=2++id=2||price=1500||name=Some other name||shipping=10||quantity=2';
          var obj = new Array();
          var arr = string.split('||');
          for(var x=0; x<arr.length;x++){
              var temp = arr[x].split('=');
              obj[temp[0]] = temp[1]
          }
          
          alert(obj['id']); // alert 1
          

          【讨论】:

            【解决方案7】:

            您可以使用正则表达式来实现这一点。例如,正则表达式 /price=([0-9]+)/ 将匹配 price=XXX,其中 XXX 是一个或多个数字。由于正则表达式的这一部分被括号包围,因此它明确地为您捕获了数字部分。

            var string = 'id=1||price=500||name=Item name||shipping=0||quantity=2++id=2||price=1500||name=Some other name||shipping=10||quantity=2'
            
            var priceRegex = /price=([0-9]+)/
            var match = string.match(priceRegex);
            console.log(match[1]); // writes 500 to the console log

            【讨论】:

              【解决方案8】:
              var str = 'id=c1||color=red||size=XL||price=500||name=Item name||shipping=0||quantity=2++id=c1||price=500||name=Item name||shipping=0||quantity=2'
              var items = str.split("++");
              for (var i=0; i<items.length; i++) {
                  var data = items[i].split("||");
                  for (var j=0; j<data.length; j++) {
                      var stuff = data[j].split("=");
                      var n = stuff[0]; 
                      var v = stuff[1];
                      eval("var "+n+"='"+v+"'");
                  }
                  alert(id);
              }
              

              编辑:根据 JamieC 的建议,您可以消除 eval("var "+n+"='"+v+"'"); 并将其替换为(稍微)更安全的 window[n] = v; - 但您仍然有一个简单的问题,即这会覆盖现有变量,更不用说您无法判断变量 color 是否在此迭代中设置,或者如果这个变量跳过它而最后一个设置了它。在循环之前创建一个空对象并将其填充到循环中(就像所有其他答案所暗示的那样)几乎在所有方面都是一种更好的方法。

              【讨论】:

              • 我同意,但这就是问题所要求的。
              • @mblase - 真的吗? OP 在哪里要求涉及eval 的解决方案?
              • 这里没有人在“构建关联数组”,我们正在构建对象。令人惊讶的是,JS 中的所有对象都是键/值对(关联数组)。所有对象,我说。
              • 我们在条款上争论不休。它像关联数组一样行走,像关联数组一样嘎嘎作响,所以我称它为关联数组。
              【解决方案9】:

              如果您可以使用 jQuery,它会使用 cookie 进行包装,并让您可以像这样访问它们:

              读取 cookie: var cmets = $.cookie('cmets');

              编写 cookie: $.cookie('cmets', '展开');

              其他人的这篇文章有一个不错的例子: http://www.vagrantradio.com/2009/10/getting-and-setting-cookies-with-jquery.html

              如果你不能使用 jQuery,你需要像现在一样进行标准的字符串解析(也许正则表达式而不是字符串分割/替换可能会减少你的代码)或者找到其他一些你可以使用的 javascript 库。

              【讨论】:

                【解决方案10】:

                首先,用++分隔符将你的字符串分成两部分(或更多部分):

                var strings = myString.split('++');
                

                那么对于每个字符串你想要一个对象,对吧?所以你需要有一个数组并像这样填充它:

                var objects = [];
                
                for (var i = 0; i < strings.length; ++i) {
                    var properties = strings[i].split('||');
                    var obj = {};
                    for (var j = 0; j < properties.length; ++j) {
                          var prop = properties[j].split('=');
                          obj[prop[0]] = prop[1]; //here you add property to your object, no matter what its name is
                    }
                    objects.push(obj);
                }
                

                因此,您有一个由您的字符串构造的所有对象的数组。当然,在现实生活中,我会添加一些检查字符串是否确实满足格式等。但我希望这个想法很清楚。

                【讨论】:

                • 我回家试试,非常感谢您的建议
                【解决方案11】:

                你可以做这样的事情,在分割字符串时对字符串求值。

                <html>
                <head>
                <script type="text/javascript">
                var string = 'id=c1||color=red||size=XL||price=500||name=Item name||shipping=0||quantity=2++id=c1||price=500||name=Item name||shipping=0||quantity=2'
                
                
                var mySplitResult = string.split("||");
                
                for(i = 0; i < mySplitResult.length; i++){
                    document.write("<br /> Element " + i + " = " + mySplitResult[i]); 
                    var assignment = mySplitResult[i].split("=");
                
                    eval(assignment[0] + "=" + "\""+assignment[1]+"\"");
                }
                document.write("Price : " + price);
                </script>
                </head>
                <body>
                </body>
                </html>
                

                【讨论】:

                  【解决方案12】:

                  如果您喜欢代码中的花哨,您可以使用 John Resig (cached here) 提出的基于正则表达式的“搜索且不替换”技巧:

                  var extract = function(string) {
                      var o = {};
                  
                      string.replace(/(.*?)=(.*?)(?:\|\||$)/g, function(all, key, value) {
                          o[key] = value;
                      });
                  
                      return o;
                  };
                  

                  然后

                  var objects = string.split('++'), 
                      i = objects.length;
                  
                  for (;i--;) {
                      objects[i] = extract(objects[i]);
                  }
                  

                  【讨论】:

                    【解决方案13】:
                    JSON.parse('[{' + string.replace(/\+\+/g, '},{').replace(/(\w*)=([\w\s]*)/g, '"$1":"$2"').replace(/\|\|/g, ',') + '}]')
                    

                    将字符串转换为 JSON 格式,然后解析。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-04-17
                      • 2011-10-25
                      • 1970-01-01
                      • 2019-06-17
                      • 1970-01-01
                      • 2016-02-16
                      相关资源
                      最近更新 更多