Javascript.RU

PHP-функция: unserialize

Javascript:

function unserialize ( inp ) {	// Creates a PHP value from a stored representation
	// 
	// +   original by: Arpad Ray (mailto:arpad@php.net)

	error = 0;
	if (inp == "" || inp.length < 2) {
		errormsg = "input is too short";
		return;
	}
	var val, kret, vret, cval;
	var type = inp.charAt(0);
	var cont = inp.substring(2);
	var size = 0, divpos = 0, endcont = 0, rest = "", next = "";

	switch (type) {
	case "N": // null
		if (inp.charAt(1) != ";") {
			errormsg = "missing ; for null";
		}
		// leave val undefined
		rest = cont;
		break;
	case "b": // boolean
		if (!/[01];/.test(cont.substring(0,2))) {
			errormsg = "value not 0 or 1, or missing ; for boolean";
		}
		val = (cont.charAt(0) == "1");
		rest = cont.substring(1);
		break;
	case "s": // string
		val = "";
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for string";
			break;
		}
		size = parseInt(cont.substring(0, divpos));
		if (size == 0) {
			if (cont.length - divpos < 4) {
				errormsg = "string is too short";
				break;
			}
			rest = cont.substring(divpos + 4);
			break;
		}
		if ((cont.length - divpos - size) < 4) {
			errormsg = "string is too short";
			break;
		}
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\";") {
			errormsg = "string is too long, or missing \";";
		}
		val = cont.substring(divpos + 2, divpos + 2 + size);
		rest = cont.substring(divpos + 4 + size);
		break;
	case "i": // integer
	case "d": // float
		var dotfound = 0;
		for (var i = 0; i < cont.length; i++) {
			cval = cont.charAt(i);
			if (isNaN(parseInt(cval)) && !(type == "d" && cval == "." && !dotfound++)) {
				endcont = i;
				break;
			}
		}
		if (!endcont || cont.charAt(endcont) != ";") {
			errormsg = "missing or invalid value, or missing ; for int/float";
		}
		val = cont.substring(0, endcont);
		val = (type == "i" ? parseInt(val) : parseFloat(val));
		rest = cont.substring(endcont + 1);
		break;
	case "a": // array
		if (cont.length < 4) {
			errormsg = "array is too short";
			return;
		}
		divpos = cont.indexOf(":", 1);
		if (divpos == -1) {
			errormsg = "missing : for array";
			return;
		}
		size = parseInt(cont.substring(1, divpos - 1));
		cont = cont.substring(divpos + 2);
		val = new Array();
		if (cont.length < 1) {
			errormsg = "array is too short";
			return;
		}
		for (var i = 0; i + 1 < size * 2; i += 2) {
			kret = unserialize(cont, 1);
			if (error || kret[0] == undefined || kret[1] == "") {
				errormsg = "missing or invalid key, or missing value for array";
				return;
			}
			vret = unserialize(kret[1], 1);
			if (error) {
				errormsg = "invalid value for array";
				return;
			}
			val[kret[0]] = vret[0];
			cont = vret[1];
		}
		if (cont.charAt(0) != "}") {
			errormsg = "missing ending }, or too many values for array";
			return;
		}
		rest = cont.substring(1);
		break;
	case "O": // object
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for object";
			return;
		}
		size = parseInt(cont.substring(0, divpos));
		var objname = cont.substring(divpos + 2, divpos + 2 + size);
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\":") {
			errormsg = "object name is too long, or missing \":";
			return;
		}
		var objprops = unserialize("a:" + cont.substring(divpos + 4 + size), 1);
		if (error) {
			errormsg = "invalid object properties";
			return;
		}
		rest = objprops[1];
		var objout = "function " + objname + "(){";
		for (key in objprops[0]) {
			objout += "" + key + "=objprops[0]['" + key + "'];";
		}
		objout += "}val=new " + objname + "();";
		eval(objout);
		break;
	default:
		errormsg = "invalid input type";
	}
	return (arguments.length == 1 ? val : [val, rest]);
}

Примеры:

unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
['Kevin', 'van', 'Zonneveld']


Автор: Гость (не зарегистрирован), дата: 6 октября, 2008 - 13:17
#permalink

не работает с многомерными масивами, нужно дорабатывать


Автор: Гость (не зарегистрирован), дата: 22 июля, 2010 - 11:15
#permalink

При работе с массивами неверно подсчитывается количество элементов массива, по причине чего идет fail без каких либо сообщений об ошибке.

строка:

size = parseInt(cont.substring(1, divpos - 1));


Автор: Гость (не зарегистрирован), дата: 6 октября, 2008 - 19:27
#permalink

а эта работает и проще выглядит
предыдущий пост мой
function PHP_Unserialize_(input)
{
var length = 0;

switch (input.charAt(0)) {
/**
* Array
*/
case 'a':
length = PHP_Unserialize_GetLength(input);
input = input.substr(String(length).length + 4);

var arr = new Array();
var key = null;
var value = null;

for (var i=0; i


Автор: Гость (не зарегистрирован), дата: 8 декабря, 2009 - 11:08
#permalink

Очень полезная функция. Автор предыдущих трех комментариев, попытался дать описание функции, действительно, работающей с многомерными массивами.

Вот ссылка на исходный код данной функции:
http://www.phpguru.org/downloads/PHP_Unserialize/ файл: PHP_Unserialize.js

Реализация на стороне сервера:
http://www.phpguru.org/downloads/PHP_Unserialize/ файл: PHP_Unserialize.phps

Не забывайте про экранирование специальных символов, функция EscapeString($str).

Для работы с русскими символами в кодировке utf-8, можно использовать следующие функции:
function encode_utf8( s ) { return unescape( encodeURIComponent( s ) ); }

function decode_utf8( s ) { return decodeURIComponent( escape( s ) ); }

Пример:
var test = PHP_Unserialize( encode_utf8( serialized ) );
//$serialized = EscapeString(serialize($var));


Автор: buzzman (не зарегистрирован), дата: 26 февраля, 2011 - 18:13
#permalink

Потребовалась эта функция, жаль, что не работает с многомерным массивом.


Автор: Гость (не зарегистрирован), дата: 16 декабря, 2012 - 17:59
#permalink

При работе с массивами неверно подсчитывается количество элементов массива, по причине чего идет fail без каких либо сообщений об ошибке.

надо изменить size = parseInt(cont.substring(1, divpos - 1)); на
size = parseInt(cont.substring(0, divpos));


Автор: alexandrn, дата: 22 августа, 2013 - 10:35
#permalink

Фикс для многомерных массивов

заменить

typeconvert = function (x) {
	return x;
};

на

typeconvert = function (x) {
	if( typeof x === 'string' && x.indexOf('a:') === 0 ){
		return _unserialize((x), 0)[2];
	}else{
		return x;
	}
};

Автор: Гость (не зарегистрирован), дата: 25 сентября, 2014 - 12:58
#permalink

булевые данные не парсит, решение:
case "b": // boolean
if (!/[01];/.test(cont.substring(0,2))) {
errormsg = "value not 0 or 1, or missing ; for boolean";
}
val = (cont.charAt(0) == "1");
rest = cont.substring(2,3);
break;


Автор: Гость (не зарегистрирован), дата: 25 сентября, 2014 - 13:19
#permalink

к предыдущему сообщению: не rest = cont.substring(2,3); а правильно: rest = cont.substring(2);


Автор: Andrei 1986 (не зарегистрирован), дата: 26 февраля, 2015 - 12:07
#permalink

Ошибка в 84 строке: size = parseInt(cont.substring(1, divpos - 1));
Надо: size = parseInt(cont.substring(0, divpos ));

Вылетает ошибка "missing ending }, or too many values for array", если объектов в массиве больше 9.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
1 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum