如何确定字符串是序列化对象/数组还是字符串?

Ric*_*nop 2 php serialization

是否有一些可靠的方法来确定字符串变量是字符串还是序列化对象/数组的字符串表示形式?

Kel*_*Kel 7

你可以调用unserialize(string $str)function:false如果string不能被反序列化,它会返回.


irc*_*ell 5

那么,你可以通过查看格式来判断.当你序列化一个数组时,你得到一个看起来像的字符串a:1:{i:0;s:3:"foo"} .如果序列化一个对象,你得到:o:7:"myclass":1:{s:3:"foo";s:3:"bar";}.

所以,如果你想测试基础,你可以做这两个正则表达式:

^a:\d+:{.*?}$
Run Code Online (Sandbox Code Playgroud)

^o:\d+:"[a-z0-9_]+":\d+:{.*?}$
Run Code Online (Sandbox Code Playgroud)

分别用于数组和对象.

请注意,这只是检查通用表单.要判断它是否是有效的序列化字符串,您需要运行它unserialize()并测试返回is_array($result)is_object($result)...

  • @andre:是的,认真的.有时您可能由于多种原因而不想反序列化(例如,如果未定义类名,或者它的价格昂贵等).在存储序列化字符串之前,它可能只是一个健全性检查.有很多原因.如果你知道一个比正则表达更好的而不称之为'unserialize`,我全都耳朵...... (2认同)