Javascript document.cookie.match不一致,有时提取错误的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

我有以下脚本(在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.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'