JSFiddle - React, Tailwind, and code Playground
by vjeux
JavaScript
console.log(Parse('i:1'));
console.log(Parse('s:5:"vjeux"'));
console.log(Parse('a:1:{i:1;s:5:"vjeux";}'));
console.log(Parse('a:1:{i:0;a:6:{s:4:"type";s:29:"application/x-shockwave-flash";s:3:"src";s:68:"http://www.youtube.com/v/TnCFj3H8QBM?version=3&autohide=1&autoplay=1";s:5:"width";s:3:"480";s:6:"height";s:3:"360";s:1:"v";s:1:"0";s:4:"safe";s:1:"1";}}'));
function Parse(str) {
var i = 0;
function parseint() {
var res = 0;
for (; '0123456789'.indexOf(str[i]) !== -1; ++i) {
res = res * 10 + parseInt(str[i], 10);
}
return res;
}
function assert(chr) {
if (str[i] !== chr) {
throw new Error('Invalid char `' + str[i] + '`, expected `' + chr + '`');
}
i++;
}
function parse() {
// Integer
if (str[i] === 'i') {
assert('i');
assert(':');
return parseint();
// String
} else if (str[i] === 's') {
assert('s');
assert(':');
var size = parseint();
assert(':');
assert('"');
var res = str.substr(i, size);
i += size;
assert('"');
return res;
// Associative Array
} else if (str[i] === 'a') {
assert('a');
assert(':');
var size = parseint();
assert(':');
assert('{');
var res = {};
for (var j = 0; j < size; ++j) {
var key = parse();
assert(';');
var value = parse();
res[key] = value;
if (str[i] === ';') {
++i;
}
}
assert('}');
return res;
} else {
throw new Error('Invalid char `' + str[i] + '`, expected `a`, `i` or `s`');
}
}
return parse();
}