我有一个遗留应用程序,它以一种特殊的格式将数据存储在数据库中
例如我有以下字符串
a:4:{i:0;s:4:"a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";}
表示以下四个单独的字符串:
粗略一瞥显示s之后的参数是相应字符串的长度。然而,这不是第一个字符串的情况,其中s之后的预期参数应为2,而是4 。
截至目前,我正在通过以下方法解析此字符串:
首先通过正则表达式获取i:0;s:4:"a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";
此后通过正则表达式^i:\d+;s:(\d+):"(.+)$
获取len = 4
和a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";
获取第一个选项,前4个字符(由于len
应为2,因此无效),以及然后得到i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";
并反复进行。
我最初也试图通过正则表达式i:\d*;s:\d*:"([^;]*)";
一次解析所有内容但如果字符串包含这个非常模式(s之后的参数应该是确定的方法),这将无效。
我还检查过,如果字符串是a’Δ
,则参数变为6.
你如何建议我处理这些字符串(带有特殊字符),你能告诉我这种格式是什么以及如何解析它吗?
PS:我正在使用java。
答案 0 :(得分:2)
您可以使用java implementation for deserializing php serialized objects (by google).
如果您需要正则表达式,可以使用以下内容:
i:\d+;s:\d+:"([^"]*)";
并使用$1
请参阅DEMO
答案 1 :(得分:2)
这是序列化的PHP数组。所以你需要的只是将它反序列化。
当您不能覆盖在此处使用的序列化功能中实现的某些数据格式时,使用regexp很容易导致这种情况。
认为这个主题有帮助:Serialize PHP => Unserialize JAVA / Serialize for php in string format