如何从javascript中的字符串中提取值?

我需要一些帮助,使用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的所有优秀人才,感谢他们提出这些精彩的想法。 因为你所有的好建议我今晚要出去喝醉了。 谢谢你们 :)

我们来写一个解析器吧!

 function parse(input) { function parseSingle(input) { var parts = input.split('||'), part, record = {}; for (var i=0; i 

用法:

 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"}] */ 

试试看:

 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 

首先,通过++分隔符将您的字符串拆分为两个(或更多)部分:

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

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

如果你可以替换|| 使用& ,您可以尝试解析它,就好像它是一个查询字符串 。 个人笔记 – JSON格式的数据将更容易使用。

我会将数据附加到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 

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

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

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

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

如果您可以使用jQuery,它会包含使用cookie并允许您访问它们,如:

读取cookie:var comments = $ .cookie(’comments’);

写一个cookie:$ .cookie(’comments’,’expanded’);

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

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

您可以使用正则表达式实现此目的。 例如,正则表达式/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 

实例: http : //jsfiddle.net/heQC8/

如果您喜欢代码中的眼睛糖果,您可以使用基于正则表达式的“搜索并且不替换”John Resig的技巧( 缓存在此处 ):

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

你可以做这样的事情,你在拆分它们时评估字符串。

        
 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 

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

 JSON.parse('[{' + string.replace(/\+\+/g, '},{').replace(/(\w*)=([\w\s]*)/g, '"$1":"$2"').replace(/\|\|/g, ',') + '}]') 

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