Javascript document.cookie.match不一致,有时提取错误的cookie值
我有以下脚本(在Google标签管理器中使用) 它必须获得cookie值。cookie的名称可能会更改,但其第一部分始终保持不变“\u comagic\u visitor” 出于某种原因,当我在控制台中使用代码获取cookie值时,我得到了正确的值:Javascript document.cookie.match不一致,有时提取错误的cookie值,javascript,regex,cookies,google-tag-manager,Javascript,Regex,Cookies,Google Tag Manager,我有以下脚本(在Google标签管理器中使用) 它必须获得cookie值。cookie的名称可能会更改,但其第一部分始终保持不变“\u comagic\u visitor” 出于某种原因,当我在控制台中使用代码获取cookie值时,我得到了正确的值: PHPSESSID=3reongfce35dl150rbdkkllto0; region=2; region2=2; _gat_UA-XXXXXX-2=1; _ym_visorc_263098=w; _ga=GA1.3.26804606X.X431
PHPSESSID=3reongfce35dl150rbdkkllto0; region=2; region2=2; _gat_UA-XXXXXX-2=1; _ym_visorc_263098=w; _ga=GA1.3.26804606X.X431002649; _comagic_visitorTH17k=cASNWQ3N9mRZT8tSmUtTGs5IG9LaD7BPHtCCiEpq_fpSnSKGMcCsEG0kPVur16gH%7C%7C124972212; _comagic_sessionTH17k=203937260
价值:972212
但使用标签管理器时,我得到了937260(正如您所看到的,它来自于“\u comagic\u session”(最后6位数字)
不幸的是,我不擅长调试,而且我的js技能很差,无法解决这个问题。关于我必须解决的问题,有什么想法吗
关于我要解决的问题有什么想法吗
您需要修复用于匹配的参数。document.cookie.match()中括号中的参数是正则表达式
From是所有cookie的字符串,由;
分隔。因为文档。cookie
只是字符串文档。cookie.match()
只是调用。string.match(regexp)
使用正则表达式参数regexp
查找匹配数组
您正在使用的regexp是:
comagic_visitor.+=.+%7C%7C.+(\\d{6})\;
此regexp表示匹配必须满足以下所有条件:
comagic_访问者
以comagic_访问者开头
+
后跟一个或多个其他字符(除换行符和其他两个字符外的任何字符)。这可能很危险
=
后接=
+
后跟一个或多个其他字符可能很危险
%7C
有点危险,这取决于您在哪里使用它,它可能是字面意义上的%7C
,也可能被翻译成|
,意思是“或”
+
一个或多个其他字符
(\\d{6})
括号将其提取为匹配结果,而\d{6}
正好是6位数字。它似乎由一个额外的\
转义,如果您使用/regexp/
而不是“regexp”
\;
是一个转义的;
,它需要最后的;
主要问题:此regexp太过松散,匹配的内容远远超出预期。+
实际上是尽可能多地匹配,并允许regexp匹配所需cookie的开头、字符串中的所有其他cookie以及某些其他cookie中的数字。因为document.cookie中的各个cookieode>可能无法保证以任何特定顺序进行匹配,贪婪匹配可能会表现出不一致的行为。当所需的cookie位于字符串末尾时,您将得到正确的结果。在其他情况下,当+
匹配过多,并且在另一个cookie的末尾有6位数字可以匹配时,您将不会得到正确的结果
备选方案#1:编写一个短函数,在
上拆分cookie字符串,该函数将拆分为一个字符串数组,然后将每个字符串分别送入match并返回第一个匹配项。这可以防止regexp在完整cookie字符串中进行错误匹配
备选方案2:修复regexp以仅匹配所需内容。您可以使用或控制台窗口测试正则表达式。您可能可以将+
更改为[^;]+
它将除换行符以外的任何字符更改为除;
以外的任何字符,这可能会修复它,因为要在完整cookie字符串中的多个cookie之间进行匹配,必须允许它匹配;
,如果我们否认不可能进行这些错误匹配
像这样:
var cml = document.cookie.match(/comagic_visitor[^;]+(\d{6})\;/)[1];
这在nodejs中对我有效
d = "PHPSESSID=3reongfce35dl150rbdkkllto0; region=2; region2=2; _gat_UA-XXXXXX-2=1; _ym_visorc_263098=w; _ga=GA1.3.26804606X.X431002649; _comagic_visitorTH17k=cASNWQ3N9mRZT8tSmUtTGs5IG9LaD7BPHtCCiEpq_fpSnSKGMcCsEG0kPVur16gH%7C%7C124972212; _comagic_sessionTH17k=203937260";
r = /comagic_visitor[^;]+(\d{6})\;/
d.match(r)[1]
---> '972212'
这不是一个真正的google analytics问题。没有代码试图将结果传递给google analytics,因此我回答了有关修复cookie匹配代码的问题。如果您仍然需要google analytics部分的帮助,请提出一个新问题,重点关注google analytics部分。
d = "PHPSESSID=3reongfce35dl150rbdkkllto0; region=2; region2=2; _gat_UA-XXXXXX-2=1; _ym_visorc_263098=w; _ga=GA1.3.26804606X.X431002649; _comagic_visitorTH17k=cASNWQ3N9mRZT8tSmUtTGs5IG9LaD7BPHtCCiEpq_fpSnSKGMcCsEG0kPVur16gH%7C%7C124972212; _comagic_sessionTH17k=203937260";
r = /comagic_visitor[^;]+(\d{6})\;/
d.match(r)[1]
---> '972212'