2016-10-11 307 views
1

我有一个很长的值的cookie,我在下面粘贴了一个例子。我需要分割名称值对并返回,在这种情况下,“id”从下面对应167814329这个cookie值的正则表达式?

我在阅读开发人员在这里使用的语法时遇到了困难(我是分析师而非开发工程师)。在过去,我已经看到名称值对与=或'|'一起使用语法作为分隔符。

它看起来好像是这个名字值对是像这样:

%22id%22%3A167814329%2C 

var usd = document.cookie.match(/(^|)user_session_data\=([^;]*)(;|$)/)[0] 
var arr = usd.split('%22') 
var ind = arr.indexOf('id'); 
var pair = arr[ind]; 

但对是等于“ID”而已,我希望能得到这个数组值%22id%22%3A167814329%2C,我可以再拆。

什么是一个干净的正则表达式得到167814329?

这里是例子cookie值进行搜索:

user_session_data=%7B%22lastUpdated%22%3A1476155189.373%2C%22active%22%3Afalse%2C%22uType%22%3A%22none%22%2C%22entitled%22%3Afalse%2C%22gift%22%3Afalse%2C%22stacked%22%3A%22none%22%2C%22usedsomestringFreeTrial%22%3A%22none%22%2C%22cancelled%22%3A%22none%22%2C%22displayName%22%3A%2220161010_gpc%40example.com%22%2C%22email%22%3A%2220161010_gpc%40example.com%22%2C%22userName%22%3A%2220161010_gpc%40example.com%22%2C%22firstName%22%3Anull%2C%22salesChannel%22%3A%22cat%22%2C%22marketingOptIn%22%3Atrue%2C%22newIssueEmailNotifyEnabled%22%3Afalse%2C%22restartSubscriptions%22%3A%5B%5D%2C%22id%22%3A167814329%2C%22purchaseType%22%3A%22NONE%22%2C%22futurePurchaseType%22%3A%22NONE%22%2C%22somestringStatus%22%3Anull%2C%22hasFuturePrivilege%22%3Afalse%2C%22rogersUser%22%3Afalse%2C%22suspendedStatus%22%3Anull%2C%22socialEmail%22%3A%22%22%2C%22somestringOffersStale%22%3Anull%2C%22somestringcabbagesPrice%22%3Anull%2C%22somestringcabbagesId%22%3Anull%2C%22somestringcabbagesFreeTrial%22%3Anull%2C%22somestringcabbagesOfferPackageId%22%3Anull%2C%22somestringcarrotsPrice%22%3Anull%2C%22somestringcarrotsId%22%3Anull%2C%22somestringcarrotsFreeTrial%22%3Anull%2C%22somestringcarrotsOfferPackageId%22%3Anull%2C%22launchedFromReader%22%3Anull%2C%22userPaymentMethod%22%3Anull%2C%22iseligibleforfreetrial%22%3Atrue%2C%22loginTimeStamp%22%3A%22Tue%20Oct%2011%202016%2011%3A06%3A29%20GMT%2B0800%20(PHT)%22%2C%22latestSubscriptionSource%22%3Anull%7D;" 

回答

2

Hanlet Escaño绝对有最准确的答案,但如果你真的想使用正则表达式,你可以。目前还不清楚是否想id%22%3a[ID]%2C或只是ID,所以这里的两个:

完全字符串:(?:^|)user_session_data\=[^;]*(id%22%3A\d+%2C)[^;]*(?:;|$)

就在ID:(?:^|)user_session_data\=[^;]*id%22%3A(\d+)%2C[^;]*(?:;|$)

在未来,如果你有一个正则表达式的麻烦,this site可以是非常有用的。

+1

谢谢伯尔尼正则表达式。但现在我不确定是否应该使用json解析或更改为正则表达式来生活!感谢您的回答 –

+1

好的回答伯尔尼。这些表情有时可以拯救生命! –

+0

解析JSON将使得将来更容易更改,并且如果您稍后需要它们,则可以访问所有字段。自从查看所有数据后,它也很难打破。如果某人的电子邮件是,例如'id%22%3A123%2C @ gmail.com',这个表达式会变得非常困惑。这就是说,也许这不是你的问题,这个快速简便的解决方案就是你想要的。 – 3ocene

4

看来,如果你删除user_session_data开头和;末一样,你只要拥有属于自己的转义字符串。您可以unescape它,让你的ID这样的(它实际上是一个JSON对象):

var obj = "%7B%22lastUpdated%22%3A1476155189.373%2C%22active%22%3Afalse%2C%22uType%22%3A%22none%22%2C%22entitled%22%3Afalse%2C%22gift%22%3Afalse%2C%22stacked%22%3A%22none%22%2C%22usedsomestringFreeTrial%22%3A%22none%22%2C%22cancelled%22%3A%22none%22%2C%22displayName%22%3A%2220161010_gpc%40example.com%22%2C%22email%22%3A%2220161010_gpc%40example.com%22%2C%22userName%22%3A%2220161010_gpc%40example.com%22%2C%22firstName%22%3Anull%2C%22salesChannel%22%3A%22cat%22%2C%22marketingOptIn%22%3Atrue%2C%22newIssueEmailNotifyEnabled%22%3Afalse%2C%22restartSubscriptions%22%3A%5B%5D%2C%22id%22%3A167814329%2C%22purchaseType%22%3A%22NONE%22%2C%22futurePurchaseType%22%3A%22NONE%22%2C%22somestringStatus%22%3Anull%2C%22hasFuturePrivilege%22%3Afalse%2C%22rogersUser%22%3Afalse%2C%22suspendedStatus%22%3Anull%2C%22socialEmail%22%3A%22%22%2C%22somestringOffersStale%22%3Anull%2C%22somestringcabbagesPrice%22%3Anull%2C%22somestringcabbagesId%22%3Anull%2C%22somestringcabbagesFreeTrial%22%3Anull%2C%22somestringcabbagesOfferPackageId%22%3Anull%2C%22somestringcarrotsPrice%22%3Anull%2C%22somestringcarrotsId%22%3Anull%2C%22somestringcarrotsFreeTrial%22%3Anull%2C%22somestringcarrotsOfferPackageId%22%3Anull%2C%22launchedFromReader%22%3Anull%2C%22userPaymentMethod%22%3Anull%2C%22iseligibleforfreetrial%22%3Atrue%2C%22loginTimeStamp%22%3A%22Tue%20Oct%2011%202016%2011%3A06%3A29%20GMT%2B0800%20(PHT)%22%2C%22latestSubscriptionSource%22%3Anull%7D" 

var myObject = JSON.parse(unescape(obj)); 
console.log(myObject.id); //167814329 

的jsfiddlehttps://jsfiddle.net/orrt86cp/

您的JSON看起来是这样的:

{ 
    "lastUpdated":1476155189.373, 
    "active":false, 
    "uType":"none", 
    "entitled":false, 
    "gift":false, 
    "stacked":"none", 
    "usedsomestringFreeTrial":"none", 
    "cancelled":"none", 
    "displayName":"[email protected]", 
    "email":"[email protected]", 
    "userName":"[email protected]", 
    "firstName":null, 
    "salesChannel":"cat", 
    "marketingOptIn":true, 
    "newIssueEmailNotifyEnabled":false, 
    "restartSubscriptions":[ 

    ], 
    "id":167814329, 
    "purchaseType":"NONE", 
    "futurePurchaseType":"NONE", 
    "somestringStatus":null, 
    "hasFuturePrivilege":false, 
    "rogersUser":false, 
    "suspendedStatus":null, 
    "socialEmail":"", 
    "somestringOffersStale":null, 
    "somestringcabbagesPrice":null, 
    "somestringcabbagesId":null, 
    "somestringcabbagesFreeTrial":null, 
    "somestringcabbagesOfferPackageId":null, 
    "somestringcarrotsPrice":null, 
    "somestringcarrotsId":null, 
    "somestringcarrotsFreeTrial":null, 
    "somestringcarrotsOfferPackageId":null, 
    "launchedFromReader":null, 
    "userPaymentMethod":null, 
    "iseligibleforfreetrial":true, 
    "loginTimeStamp":"Tue Oct 11 2016 11:06:29 GMT+0800 (PHT)", 
    "latestSubscriptionSource":null 
} 
+0

谢谢!但实际上,我目前已经在使用JSON.parse,它在我的浏览器中工作。但我们的分析显示,实际上约3-5%的时间没有获得用户名。所以,我希望正则表达式可能能够收紧。但我真的不确定。是否有更基本的正则表达式来解决这个问题?这会导致更好的数据捕获吗?我不确定 –

+0

哎呀。你在问题中没有说清楚。对这类任务使用正则表达式可能与解析JSON对象一样不安全。 –

+0

感谢您的反馈。嗯,所以你认为坚持JSON解析将是最强大的方式? –