Есть ли какой-нибудь надежный способ узнать, является ли строковая переменная просто строкой или строковым представлением сериализованного объекта / массива?
Ну, вы можете сказать, глядя на формат. Когда вы сериализуете массив, вы получаете строку, которая выглядит как a:1:{i:0;s:3:"foo"}
И если вы сериализуете объект, вы получаете: o:7:"myclass":1:{s:3:"foo";s:3:"bar";}
.
Поэтому, если вы хотите проверить рудиментарность, вы можете выполнить следующие два регулярных выражения:
^a:\d+:{.*?}$
А также
^o:\d+:"[a-z0-9_]+":\d+:{.*?}$
для массивов и объектов соответственно.
Обратите внимание, что это просто проверяет общую форму. Чтобы узнать, является ли это допустимой последовательной строкой, вам нужно запустить ее через unserialize()
и проверить return is_array($result)
и is_object($result)
…
Вы можете вызвать функцию unserialize(string $str)
: она возвращает false
, если строка не может быть несериализована.