PHP: сериализация и десериализация строки, содержащей экранированные символы - PullRequest
4 голосов
/ 22 августа 2011

Как правильно сериализовать и десериализовать строку, содержащую экранированные символы?

Дано:

$data = "\'test\'";
$out= serialize($data);
print_r($out); // ->  s:8:"\'test\'";

Проблема здесь в том, что длина строки не принята unserialize:

$out = 's:8:"\'test\'"';
var_dump(unserialize($out)); // -> bool(false)

Но если я изменю длину строки на 6 (игнорируя escape-символы):

$out = 's:6:"\'test\'"';
var_dump(unserialize($out)); // -> string(6) "'test'"

Правильно десериализуется.

Что было бы хорошим способом решения этой проблемы?

Ответы [ 4 ]

5 голосов
/ 22 августа 2011

Я бы попробовал позвонить base64_encode() перед сериализацией данных, а затем base64_decode() после десериализации данных.

$data = "\'test\'";
$out= serialize(base64_encode($data));
var_dump(base64_decode(unserialize($out))); // -> bool(false)
3 голосов
/ 22 августа 2011

Ваши тестовые примеры не совпадают, в первом примере вы заключаете строку в двойные кавычки, а во второй - в одинарные кавычки, в последнем из которых буквально понимается escape-символ.1003 * отличается от

$data = "\'test\'";

, если вы сделаете

$data = "\'test\'";
$out= serialize($data);
print_r($out); // ->  s:8:"\'test\'";
$data = unserialize($out);
print_r($data); // -> \'test\'

, это будет работать.

3 голосов
/ 22 августа 2011

Проблема в том, что ваши escape-символы оцениваются PHP.Если вы хотите сохранить их нетронутыми, вам также следует избегать их :)

2 голосов
/ 26 июля 2012

Вместо использования сериализации и десериализации, попробуйте json_encode и json_decode.Последний сделает (не) экранирование кавычек для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...