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或其他.
你有很多建议试图用这种或那种方式解析它,但真正的问题是为什么?
为什么不只是有一个小的Perl程序加载它,并吐出一个等效的JSON字符串.
然后,您可以从PHP中调用Perl程序来进行转换; 这意味着你使用Perl来读取Perl格式,这将保证正确的转换.
或者(更好的是)批量运行它对整个数据库,从数据库中删除特定于Perl的数据格式; 那么你可以使用PHP的标准JSON函数.
这将使您的PHP代码(或者您需要在以后阅读数据时使用的任何其他语言)的生活变得更加简单.
既然你说你不能改变格式:
我不喜欢使用 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 字符串更新数据库行。这将为您省去将来的麻烦,并允许您根据新标准更新所有数据。