如何在PHP中反序列化Perl Data :: Dumper输出

Dim*_*duh 6 php perl serialization data-dumper

我在Perl中有一个导出变量的结果,就像这个字符串:

$VAR1 = {
    'guard' => undef,
    'work_hand' => undef,
    'images' => 
        {'1' => 
            {
            'mini_height' => 150,
            'width' => 150,
            'extension' => 'jpg',
            'filename' => 'object_1.1330907414.96873.jpg',
            'mini_width' => 150,
            'class' => 'Ontico::Image',
            'height' => 150,
            'mini_filename' => 'object_1.1330907414.96873.mini.jpg',
            'size' => 26053,
            'symname' => 'big_logo'
            },
        '2' => 
            {
            'width' => 48,
            'extension' => 'jpg',
            'alt' => '??????? ????????',
            'height' => 48,
            'mini_filename' => 'object_91.1235312905.mini.jpg',
            'size' => 12809,
            'symname' => 'logo',
            'mini_height' => 150,
            'filename' => 'object_91.1235312905.jpg',
            'mini_width' => 150,
            'class' => 'Ontico::Image'
            }
        },
        'show_league_banner' => 0,
        'back_hand' => undef,
        'weight_category' => undef,
        'stick_position' => undef
    };
Run Code Online (Sandbox Code Playgroud)

如何在PHP中反序列化此数据?

PS我在DB中已经有这种格式的数据,我无法将其更改为json或其他.

SDC*_*SDC 5

你有很多建议试图用这种或那种方式解析它,但真正的问题是为什么?

为什么不只是有一个小的Perl程序加载它,并吐出一个等效的JSON字符串.

然后,您可以从PHP中调用Perl程序来进行转换; 这意味着你使用Perl来读取Perl格式,这将保证正确的转换.

或者(更好的是)批量运行它对整个数据库,从数据库中删除特定于Perl的数据格式; 那么你可以使用PHP的标准JSON函数.

这将使您的PHP代码(或者您需要在以后阅读数据时使用的任何其他语言)的生活变得更加简单.


Mik*_*osh 0

既然你说你不能改变格式:

我不喜欢使用 eval,但是因为你的语法非常接近预期的 PHP 数组语法,所以我认为我们可以让它滑动。

设置$string等于数据库中符合以下格式的内容。请参阅下面的使用您提供的数据的工作示例。最终,PHP 会将 Perl var 开头的变量设置为新的解析数组。

由于它将是一个文本块/大字符串,请执行以下操作:

<?php
$string = "\$VAR1 = {
    'guard' => undef,
    'work_hand' => undef,
    'images' =>
        {'1' =>
            {
            'mini_height' => 150,
            ... // truncated for readability
    };";

$res = str_replace(array("{", "}", 'undef'), array("array(", ")", "''"), $string);

eval($res);

print_r($VAR1);
Run Code Online (Sandbox Code Playgroud)

你的结果是:

Array
(
    [guard] =>
    [work_hand] =>
    [images] => Array
        (
            [1] => Array
                (
                    [mini_height] => 150 ...
Run Code Online (Sandbox Code Playgroud)

注意:我建议您现在花点时间将数据库内容改造并升级为更标准的格式,因为这样将来会更容易维护。

您可以循环访问数据库,逐行获取所有内容,然后将数据运行到上面的函数中,将其包装起来json_encode()并使用新的 JSON 字符串更新数据库行。这将为您省去将来的麻烦,并允许您根据新标准更新所有数据。