Регулярное выражение в Lucee refindNoCase

Мне нужно преобразовать часть кода, чтобы он работал на 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 вывод переменных.sessionId = CC319C9B3CFA261A72724EAEB36B5C2D, что мне и нужно.

Lucee выдает ошибку: невозможно преобразовать массив сложных объектов в строку, поэтому я изменил свой код на:


        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];
            }
        }

Но теперь variable.sessionId содержит «JSESSIONID = CC319C9B3CFA261A72724EAEB36B5C2D».

Как это может быть другим? Я также пытался использовать жестко запрограммированные строки на https://regex101.com/r/cO8lqs/4. , давая мне только «CC319C9B3CFA261A72724EAEB36B5C2D») И при запуске фрагмента кода на https://docs.lucee.org/reference/functions/refindnocase.html, что дает мне «JSESSIONID=CC319C9B3CFA261A72724EAEB36B5C2D». Оба работают с одной и той же строкой. Как мне в Lucee получить то, что мне нужно, только «CC319C9B3CFA261A72724EAEB36B5C2D»? И он также должен работать на CF, так как наш рабочий сервер все еще работает на ACF.


person Veni    schedule 14.01.2021    source источник
comment
У вас есть refind.match[2], но только одна группа захвата. Попробуйте refind.match[1]. Кроме того, работает ли "(?<=JSESSIONID=)\w+(?=;)"?   -  person Wiktor Stribiżew    schedule 14.01.2021
comment
Какая у тебя версия Люси? Была проблема с тем, что reFind() и reFindNoCase() не возвращали массив совпадений для групп захвата правильно, и это было исправлено всего несколько месяцев назад в 5.3.8.80 согласно luceeserver.atlassian.net/browse/LDEV-2333?oldIssueView=true   -  person Sev Roberts    schedule 14.01.2021
comment
@WiktorStribiżew Я думаю, что, возможно, сериализация делает это совсем другим. Версия, которую мы используем на CF (без сериализации), работает и дает нам match[2] с правильным значением. Попытка этого (?‹=JSESSIONID=)\w+(?=;) но получение ошибки ' Последовательность (?‹...) не распознана. Я недостаточно знаю о функциональности регулярных выражений, чтобы понять, откуда это взялось. Но я начинаю думать о том, чтобы забыть об использовании match и исправить это другим способом.   -  person Veni    schedule 15.01.2021
comment
@SevRoberts Это действительно похоже на проблему, с которой я столкнулся, спасибо! Тестирование на моем локальном компьютере через окно команд, работающее на 5.3.4.80. Я только что обновился, но теперь он дает мне 5.3.7.47, так что это еще не та версия, в которой проблема с совпадением исправлена. У нас также есть наш тестовый сервер, работающий на Lucee, но я не в состоянии обновить его, и я думаю, что это займет несколько недель. На данный момент я буду использовать обходной путь, подобный тому, который вы предоставили в ответе ниже.   -  person Veni    schedule 15.01.2021


Ответы (1)


Это не объясняет, почему в Lucee по-другому, что может быть следствием ошибки, недавно исправленной в https://luceeserver.atlassian.net/browse/LDEV-2333?oldIssueView=true - но ответ на ваш вопрос:

Как мне в Lucee получить то, что мне нужно, только «CC319C9B3CFA261A72724EAEB36B5C2D»? И он также должен работать на CF, так как наш рабочий сервер все еще находится на ACF.

...что даст вам желаемый результат как с Adobe, так и с 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>
person Sev Roberts    schedule 14.01.2021
comment
Спасибо. Я думаю, что я выберу это решение, так как я не могу быстро обновиться, чтобы увидеть, есть ли исправление в версии 5.3.4.80. Не уверен, однако, должен ли я отметить ваш ответ как ответ, который решил проблему, потому что это больше похоже на обходной путь. Я сам пытался реализовать обходной путь, но все время задавался вопросом, почему вывод матча отличается от CF. На самом деле ваш ответ выше об исправлении lucee был ответом, который решает проблему :-) - person Veni; 15.01.2021
comment
Это охватывает оба вопроса - Как это может быть по-другому? и Как мне действовать в Lucee, чтобы получить то, что мне нужно... поэтому я думаю, что вы должны отметить это как ответ. Но тогда я бы сказал, что :-) - person Sev Roberts; 18.01.2021
comment
Согласен, проблема исправлена, причина ясна (по вашим ответам). Спасибо еще раз! - person Veni; 18.01.2021