[英]How to extract values from a string in 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<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"}]
*/
您可以使用正則表達式來實現這一點。 例如,正則表達式/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
試試看:
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
首先,通過++
分隔符將您的字符串分成兩個(或更多)部分:
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 庫。
如果您喜歡代碼中的糖果,您可以使用 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<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;
替換它window[n] = v;
-- 但是您仍然有一個簡單的問題,即這會覆蓋現有變量,更不用說您無法判斷變量color
是否在此迭代中設置,或者是否跳過它而最后一個設置了它。 在循環之前創建一個空對象並將其填充到循環內(就像所有其他答案所建議的那樣)幾乎在所有方面都是更好的方法。
你可以做這樣的事情,在拆分字符串時評估字符串。
<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>
JSON.parse('[{' + string.replace(/\+\+/g, '},{').replace(/(\w*)=([\w\s]*)/g, '"$1":"$2"').replace(/\|\|/g, ',') + '}]')
將字符串轉換為 JSON 格式,然后解析它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.