【问题标题】:Regex in Lucee refindNoCaseLucee refindNoCase 中的正则表达式
【发布时间】:2021-01-14 14:43:15
【问题描述】:

我需要转换一段代码才能在 Lucee 上运行。

这是 CF 中的工作代码,在 Lucee 中不起作用:

  if(structKeyExists(response.responseheader, 'Set-Cookie')) {
        var refind = refindNoCase("JSESSIONID=([\w\d]+);", response.responseheader['Set-Cookie'], 1, true);
        if(structkeyexists(refind, 'match') and isArray(refind.match) and arraylen(refind.match) == 2) {
            variables.sessionId = refind.match[2];
        }
    }

response.responseheader['Set-Cookie'] 是一个数组:

Array
1   
string  JSESSIONID=CC319C9B3CFA261A72724EAEB36B5C2D; HttpOnly=false; Secure; SameSite=None

在 CF 中 variables.sessionId = CC319C9B3CFA261A72724EAEB36B5C2D 的输出正是我所需要的。

Lucee 抛出错误:Can't cast Complex Object Type Array to String,所以我将代码更改为:


        if(structKeyExists(response.responseheader, 'Set-Cookie')) {
            var refind = refindNoCase("JSESSIONID=([\w\d]+);", serialize(response.responseheader['Set-Cookie']), 1, true);
            if(structkeyexists(refind, 'match') and isArray(refind.match) and arraylen(refind.match) == 2) {
                variables.sessionId = refind.match[2];
            }
        }

但现在 variables.sessionId 包含 'JSESSIONID=CC319C9B3CFA261A72724EAEB36B5C2D'

这有什么不同? 我还尝试在https://regex101.com/r/cO8lqs/4 上使用硬编码字符串,只给我'CC319C9B3CFA261A72724EAEB36B5C2D') 在https://docs.lucee.org/reference/functions/refindnocase.html 上运行代码 sn-p 时,给我 'JSESSIONID=CC319C9B3CFA261A72724EAEB36B5C2D' 两者都使用完全相同的字符串运行。 我将如何在 Lucee 获得我需要的东西,只有“CC319C9B3CFA261A72724EAEB36B5C2D”? 而且它也需要在 CF 上运行,因为我们的生产服务器仍在 ACF 上..

【问题讨论】:

  • 你有refind.match[2],但你只有一个捕获组。试试refind.match[1]。另外,"(?<=JSESSIONID=)\w+(?=;)" 有效吗?
  • 您使用的是哪个版本的 Lucee? reFind()reFindNoCase() 没有正确返回捕获组的匹配数组存在问题,并且这仅在几个月前根据 luceeserver.atlassian.net/browse/LDEV-2333?oldIssueView=true 修复在 5.3.8.80 中
  • @WiktorStribiżew 我认为序列化可能使它变得完全不同。我们在 CF 上运行的版本(没有序列化)正在运行,并为我们提供了正确值的 match[2]。尝试这个 (?
  • @SevRoberts 这确实与我遇到的问题一模一样,谢谢!通过命令框在我的本地测试,在 5.3.4.80 上运行。我刚刚更新,但它现在给了我 5.3.7.47,所以还没有修复匹配问题的版本。我们的测试服务器也在 Lucee 上运行,但我无法升级,我认为这需要几周时间才能完成。现在我将使用一种解决方法,就像您在下面的答案中提供的那样

标签: regex coldfusion lucee


【解决方案1】:

这并不能解释为什么它在 Lucee 中有所不同 - 这可能是最近在 https://luceeserver.atlassian.net/browse/LDEV-2333?oldIssueView=true 中修复的错误的结果 - 但可以回答您的问题:

“我将如何在 Lucee 获得我需要的东西,只有 'CC319C9B3CFA261A72724EAEB36B5C2D'?它还需要在 CF 上运行, 因为我们的生产服务器仍在 ACF 上”

...用 Adob​​e 和 Lucee 为您提供所需的结果,将是使用 variables.sessionId = listFirst(listLast(refind.match[2],'='),';');

独立示例(var 已删除,因为它不在此处的函数中)=

<cfscript>
response.responseheader['Set-Cookie'] = ["JSESSIONID=CC319C9B3CFA261A72724EAEB36B5C2D; HttpOnly=false; Secure; SameSite=None"];
if(structKeyExists(response.responseheader, 'Set-Cookie')) {
        refind = refindNoCase("JSESSIONID=([\w\d]+);", response.responseheader['Set-Cookie'][1], 1, true);
        if(structkeyexists(refind, 'match') and isArray(refind.match) and arraylen(refind.match) == 2) {
            variables.sessionId = listFirst(listLast(refind.match[2],'='),';');
        }
    }
writeDump(variables.sessionId);
</cfscript>

【讨论】:

  • 谢谢。我想我会采用这个解决方案,因为我无法快速升级以查看版本 5.3.4.80 中的修复。不确定我是否应该将您的回复标记为解决问题的答案,因为它更像是一种解决方法。我倾向于自己实现一种解决方法,但一直想知道为什么匹配输出与 CF 不同。实际上,您上面关于 lucee 修复的答案是解决问题的答案:-)
  • 这涵盖了两个问题 - “这有什么不同?”“我将如何在 Lucee 获得我需要的东西...... " 所以我认为你应该将此标记为答案。但是我会说:-)
  • 我同意,问题已解决,原因很明确(根据您的回答)。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2015-04-27
相关资源
最近更新 更多