簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM