如何在php中解析序列化数据字段?

时间:2017-04-30 05:59:17

标签: php parsing serialization

我有一个来自Drupal的序列化数据字段,我无法弄清楚如何正确解析。这是序列化数据的一个示例:

module.exports = makeBig;

我已经走到了这一步:

a:10:{s:7:"contact";s:1:"1";s:19:"profile_affiliation";s:23:"The Learning Tree, Inc.";s:18:"profile_first_name";s:3:"Ben";s:22:"profile_street_address";s:19:"8718 Terrell Ct. S.";s:12:"profile_city";s:6:"Mobile";s:13:"profile_state";s:2:"AL";s:15:"profile_country";s:3:"USA";s:15:"profile_zipcode";s:5:"36695";s:18:"profile_home_phone";s:10:"2516494420";s:17:"profile_last_name";s:6:"Rogers";}

这不按预期工作。我收到这些错误:

$data = serializeddata;
$var = unserialize($data);

foreach ($var as $value) {
    echo $value['profile_first_name'];
}

也许我需要做更多的工作来解析反序列化的数据,这样我就可以按名称获取每个值。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:0)

$data = serializeddata;
$var = unserialize($data);

foreach ($var as $value) {
    echo $value['contact'];
}

答案 1 :(得分:0)

检查此代码。它会工作,你的序列化数据格式不好。所以在这种情况下你的代码不起作用  首先,您的序列化数据格式需要更新

$seriliaze = 'a: 7:{s: 7:"contact";i: 1;s: 18:"profile_first_name";s: 5:"John";s: 17:"profile_last_name";s: 6:"Smith";}';

 $seriliaze = 'a:5:{i:1;s:7:"contact";i:2;s:18:"profile_first_name";i:3;s:4:"John";i:4;s:17:"profile_last_name";i:5;s:5:"Smith";}';

然后部分替换

1. a: 7 -> a:5 // cause total 5 data
2. add index for every section like i:1;s:7:"contact";
3. s: 5:"John"; -> s:4:"John"; // cause 4 length
4. s: 6:"Smith"; -> s:5:"Smith"; // cause 5 length

在此部分更新后,您的代码将起作用,请立即检查

<?php
$seriliaze = 'a:5:{i:1;s:7:"contact";i:2;s:18:"profile_first_name";i:3;s:4:"John";i:4;s:17:"profile_last_name";i:5;s:5:"Smith";}';
$unserialize = unserialize($seriliaze);
echo "<pre>";
print_r($unserialize);

然后输出:

   Array
(
    [1] => contact
    [2] => profile_first_name
    [3] => John
    [4] => profile_last_name
    [5] => Smith
)

如果您获得数据,请使用此代码

  $i = 0;
  $j = 0;
  $format_value = '';
  foreach ($unserialize as $value) {
      $i++;
      if($i == 1){
        continue;
      }
      if($j < 2){
        $j++;
        if($j == 1 ){
           $format_value .= $value.' : ';
        } else {
           $format_value .= $value;
        }

      }
      if( $j== 2){
       $j =0;
        echo $format_value;
        $format_value = '';
      echo "<br>";
      }

  }

然后输出:

profile_first_name : John
profile_last_name : Smith

答案 2 :(得分:0)

我能够在一些帮助下找到这个。问题是您需要在解析之前先修复数据。

$fixed = preg_replace_callback(
   '/s:([0-9]+):\"(.*?)\";/',
   function ($matches) { return "s:".strlen($matches[2]).':"'.$matches[2].'";';     },
      $data
   );
$original_array=unserialize($fixed);

然后你可以解析出来:

foreach ($original_array as $key => $value) {
    echo $key .": ". $value;
};