Regex для сопоставления сериализованных данных PHP внутри строки

php regex

495 просмотра

1 ответ

90 Репутация автора

Я работаю с менеджером сеансов Zend Framework 2 в PHP и хочу десериализовать данные сеанса, чтобы я мог изменить способ хранения данных. Я думал, что регулярное выражение было способом сделать это, но я не могу понять, как убедиться, что регулярное выражение подходит для этого типа строки.

Пример ввода:

__ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxxxxxxxxxxxxxxx";}}initialized|C:23:"Zend\Stdlib\ArrayObject":403:{a:4:{s:7:"storage";a:3:{s:4:"init";i:1;s:10:"remoteAddr";s:13:"127.000.00.01";s:13:"httpUserAgent";s:114:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";}s:4:"flag";i:2;s:13:"iteratorClass";s:13:"ArrayIterator";s:19:"protectedProperties";a:4:{i:0;s:7:"storage";i:1;s:4:"flag";i:2;s:13:"iteratorClass";i:3;s:19:"protectedProperties";}}}

Ожидаемый результат:

'__ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxxxxxxxxxxxxxxx";}}'
'initialized|C:23:"Zend\Stdlib\ArrayObject":403:{a:4:{s:7:"storage";a:3:{s:4:"init";i:1;s:10:"remoteAddr";s:13:"127.000.00.01";s:13:"httpUserAgent";s:114:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";}s:4:"flag";i:2;s:13:"iteratorClass";s:13:"ArrayIterator";s:19:"protectedProperties";a:4:{i:0;s:7:"storage";i:1;s:4:"flag";i:2;s:13:"iteratorClass";i:3;s:19:"protectedProperties";}}}'

Что я пробовал:

$pattern = '/\w+\|.*?}}+/'; // this works for the sample input, but may be too general and certainly won't work for serialized data without a nested array
$pattern = '/\w+\|(a:\d+:{.*?}|o:\d+:\"[a-z0-9_]+\":\d+:{.*?})/'; // doesn't capture the `initialized` data

Где я застрял

В общем, я не могу понять, как лучше отделить __ZFданные от initializedданных (особенно, когда в сеансе есть другие не-Zend-переменные). В частности, я не могу понять, какое регулярное выражение использовать для получения сериализованных данных.

Я попытался привести пример на RegexPlanet, но не смог понять интерфейс, и он только казался странным результатом. Если это поможет, я уверен, что ZF PHP выдает свои сериализованные данные сеанса следующим образом:

$text = "";
foreach ($_SESSION as $key => $value) {
    $text .= $key . "|" . serialize($value);
}

... но я не нашел исходный код для этого.

Автор: Miryafa Источник Размещён: 18.07.2016 04:06

Ответы (1)


1 плюс

9415 Репутация автора

Решение

Я узнал об ini_set ('session.serialize_handler', 'php_serialize'); Он изменяет сериализацию для использования обычного метода сериализации в PHP вместо альтернативного, что решает проблему. - Миряфа

Автор: Armali Размещён: 01.08.2016 06:47
Вопросы из категории :
32x32