Last active
July 11, 2016 11:05
-
-
Save ableasdale/c86860be7a4d23bfef3a6e0ab01a3b43 to your computer and use it in GitHub Desktop.
MarkLogic / JavaScript: Unserializing output from PHP's serialize()
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Unserialize data taken from PHP's serialize() output | |
* | |
* Taken from https://github.com/kvz/phpjs/blob/master/functions/var/unserialize.js | |
* Fixed window reference to make it nodejs-compatible | |
* | |
* @param string serialized data | |
* @return unserialized data | |
* @throws | |
*/ | |
function unserialize (data) { | |
// http://kevin.vanzonneveld.net | |
// + original by: Arpad Ray (mailto:[email protected]) | |
// + improved by: Pedro Tainha (http://www.pedrotainha.com) | |
// + bugfixed by: dptr1988 | |
// + revised by: d3x | |
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) | |
// + input by: Brett Zamir (http://brett-zamir.me) | |
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) | |
// + improved by: Chris | |
// + improved by: James | |
// + input by: Martin (http://www.erlenwiese.de/) | |
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) | |
// + improved by: Le Torbi | |
// + input by: kilops | |
// + bugfixed by: Brett Zamir (http://brett-zamir.me) | |
// + input by: Jaroslaw Czarniak | |
// % note: We feel the main purpose of this function should be to ease the transport of data between php & js | |
// % note: Aiming for PHP-compatibility, we have to translate objects to arrays | |
// * example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'); | |
// * returns 1: ['Kevin', 'van', 'Zonneveld'] | |
// * example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'); | |
// * returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'} | |
var that = this, | |
utf8Overhead = function (chr) { | |
// http://phpjs.org/functions/unserialize:571#comment_95906 | |
var code = chr.charCodeAt(0); | |
if (code < 0x0080) { | |
return 0; | |
} | |
if (code < 0x0800) { | |
return 1; | |
} | |
return 2; | |
}, | |
error = function (type, msg, filename, line) { | |
throw new window[type](msg, filename, line); | |
}, | |
read_until = function (data, offset, stopchr) { | |
var i = 2, buf = [], chr = data.slice(offset, offset + 1); | |
while (chr != stopchr) { | |
if ((i + offset) > data.length) { | |
error('Error', 'Invalid'); | |
} | |
buf.push(chr); | |
chr = data.slice(offset + (i - 1), offset + i); | |
i += 1; | |
} | |
return [buf.length, buf.join('')]; | |
}, | |
read_chrs = function (data, offset, length) { | |
var i, chr, buf; | |
buf = []; | |
for (i = 0; i < length; i++) { | |
chr = data.slice(offset + (i - 1), offset + i); | |
buf.push(chr); | |
length -= utf8Overhead(chr); | |
} | |
return [buf.length, buf.join('')]; | |
}, | |
_unserialize = function (data, offset) { | |
var dtype, dataoffset, keyandchrs, keys, | |
readdata, readData, ccount, stringlength, | |
i, key, kprops, kchrs, vprops, vchrs, value, | |
chrs = 0, | |
typeconvert = function (x) { | |
return x; | |
}; | |
if (!offset) { | |
offset = 0; | |
} | |
dtype = (data.slice(offset, offset + 1)).toLowerCase(); | |
dataoffset = offset + 2; | |
switch (dtype) { | |
case 'i': | |
typeconvert = function (x) { | |
return parseInt(x, 10); | |
}; | |
readData = read_until(data, dataoffset, ';'); | |
chrs = readData[0]; | |
readdata = readData[1]; | |
dataoffset += chrs + 1; | |
break; | |
case 'b': | |
typeconvert = function (x) { | |
return parseInt(x, 10) !== 0; | |
}; | |
readData = read_until(data, dataoffset, ';'); | |
chrs = readData[0]; | |
readdata = readData[1]; | |
dataoffset += chrs + 1; | |
break; | |
case 'd': | |
typeconvert = function (x) { | |
return parseFloat(x); | |
}; | |
readData = read_until(data, dataoffset, ';'); | |
chrs = readData[0]; | |
readdata = readData[1]; | |
dataoffset += chrs + 1; | |
break; | |
case 'n': | |
readdata = null; | |
break; | |
case 's': | |
ccount = read_until(data, dataoffset, ':'); | |
chrs = ccount[0]; | |
stringlength = ccount[1]; | |
dataoffset += chrs + 2; | |
readData = read_chrs(data, dataoffset + 1, parseInt(stringlength, 10)); | |
chrs = readData[0]; | |
readdata = readData[1]; | |
dataoffset += chrs + 2; | |
if (chrs != parseInt(stringlength, 10) && chrs != readdata.length) { | |
error('SyntaxError', 'String length mismatch'); | |
} | |
break; | |
case 'a': | |
readdata = {}; | |
keyandchrs = read_until(data, dataoffset, ':'); | |
chrs = keyandchrs[0]; | |
keys = keyandchrs[1]; | |
dataoffset += chrs + 2; | |
for (i = 0; i < parseInt(keys, 10); i++) { | |
kprops = _unserialize(data, dataoffset); | |
kchrs = kprops[1]; | |
key = kprops[2]; | |
dataoffset += kchrs; | |
vprops = _unserialize(data, dataoffset); | |
vchrs = vprops[1]; | |
value = vprops[2]; | |
dataoffset += vchrs; | |
readdata[key] = value; | |
} | |
dataoffset += 1; | |
break; | |
default: | |
error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype); | |
break; | |
} | |
return [dtype, dataoffset - offset, typeconvert(readdata)]; | |
} | |
; | |
return _unserialize((data + ''), 0)[2]; | |
} | |
unserialize('a:5:{s:5:"width";i:665;s:6:"height";i:210;s:4:"file";s:42:"2015/06/Screenshot-2015-04-27-16.40.11.png";s:5:"sizes";a:3:{s:9:"thumbnail";a:4:{s:4:"file";s:42:"Screenshot-2015-04-27-16.40.11-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}s:6:"medium";a:4:{s:4:"file";s:41:"Screenshot-2015-04-27-16.40.11-300x95.png";s:5:"width";i:300;s:6:"height";i:95;s:9:"mime-type";s:9:"image/png";}s:14:"post-thumbnail";a:4:{s:4:"file";s:42:"Screenshot-2015-04-27-16.40.11-665x198.png";s:5:"width";i:665;s:6:"height";i:198;s:9:"mime-type";s:9:"image/png";}}s:10:"image_meta";a:11:{s:8:"aperture";i:0;s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";i:0;s:9:"copyright";s:0:"";s:12:"focal_length";i:0;s:3:"iso";i:0;s:13:"shutter_speed";i:0;s:5:"title";s:0:"";s:11:"orientation";i:0;}}') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment