2016-07-18 28 views
1

PHPで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データを分割します(特に、セッションに他の非Zend変数がある場合)。具体的には、シリアル化されたデータを取得するためにどの正規表現を使用するかわかりません。

私はRegexPlanetに例を入れようとしましたが、インターフェイスを特定できず、奇妙な結果しか得られないようでした。それが助け場合、私は ZF PHPはこのようなそのシリアライズされたセッションデータを生成し、かなり確信している:

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

を...しかし、私は、そのためのソースコードを発見していません。

+0

シリアル化時にJSON形式で作業しているようです。 Regexの問題を攻撃するのではなく、JSONにアタッチしようとしましたか? –

+0

@RodrigoGomesこれがJSONであることはわかりませんでした。しかし、JSONは特定の書式設定スタイルの単なる単語だと思っていました。特に、私が正しく理解すれば、分離したいデータの部分はJSONではありません。ここでJSONを使用するにはどうすればよいですか? – Miryafa

+0

あなたの最善の策は[session_decode'を含む](http://php.net/manual/en/function.session-decode.php#113523)かもしれません。 – melpomene

答えて

1

私はini_set( 'session.serialize_handler'、 'php_serialize')について知りました。それは、問題を解決する代わりにPHPの通常のシリアライズメソッドを使用するようにシリアライズを変更します。 - Miryafa

関連する問題