<?php
function getFunction($input, &$results) {
$moved = 0;
//echo sprintf('Parsing: "%s"' . "\n", $input);
if(preg_match('/\A\&([a-z]+)\(/', $input, $matches)) { $matchlength = strlen($matches[0]);
$remaining = substr($input, $matchlength); $moved += $matchlength;
$result['type'] = 'call';
$result['name'] = $matches[1];
$result['args'] = array();
//echo sprintf('Function: "%s"' . "\n", $result['name']);
$recMoved = getFunction($remaining, $tmpArgs);
$remaining = substr($remaining, $recMoved); $moved += $recMoved;
}
$remaining = substr($remaining, 1); $moved += 1;
foreach($tmpArgs as $arg) {
if($arg['type'] == 'call') {
$result['args'][] = $arg;
} else {
echo sprintf('Parsing content as args "%s"' . "\n", $arg['content']); foreach(explode(',', $arg['content']) as $j) { //echo sprintf('Parsing content as args = "%s"' . "\n", $j);
//echo sprintf('Parsing content as args ... "%s"' . "\n", $matches[1]);
if($matches[1]) {
$result['args'][] = array('type' => 'content', 'content' => $matches[1]); }
}
}
}
} else {
$matchlength = strlen($matches[0]);
//echo sprintf('Content: "%s"' . "\n", $matches[0]);
$result['content'] = $matches[0];
$moved += $matchlength;
}
$results[] = $result;
return $moved;
}
getFunction($input, $result);
// you can now recursively parse the structure using your own code
?>
PD9waHAKZnVuY3Rpb24gZ2V0RnVuY3Rpb24oJGlucHV0LCAmJHJlc3VsdHMpIHsKCSRpbnB1dCA9IHRyaW0oJGlucHV0KTsKCQoJJHJlc3VsdCA9IGFycmF5KCk7CgkkbW92ZWQgPSAwOwoJCgkvL2VjaG8gc3ByaW50ZignUGFyc2luZzogIiVzIicgLiAiXG4iLCAkaW5wdXQpOwoJCglpZihwcmVnX21hdGNoKCcvXEFcJihbYS16XSspXCgvJywgJGlucHV0LCAkbWF0Y2hlcykpIHsKCQkkbWF0Y2hsZW5ndGggPSBzdHJsZW4oJG1hdGNoZXNbMF0pOwoJCQoJCSRyZW1haW5pbmcgPSBzdWJzdHIoJGlucHV0LCAkbWF0Y2hsZW5ndGgpOwoJCSRtb3ZlZCArPSAkbWF0Y2hsZW5ndGg7CgkJCgkJJHJlc3VsdFsndHlwZSddID0gJ2NhbGwnOwoJCSRyZXN1bHRbJ25hbWUnXSA9ICRtYXRjaGVzWzFdOwoJCSRyZXN1bHRbJ2FyZ3MnXSA9IGFycmF5KCk7CgkJCgkJLy9lY2hvIHNwcmludGYoJ0Z1bmN0aW9uOiAiJXMiJyAuICJcbiIsICRyZXN1bHRbJ25hbWUnXSk7CgkJCgkJJHRtcEFyZ3MgPSBhcnJheSgpOwoJCXdoaWxlKCFwcmVnX21hdGNoKCcvXEFcKS8nLCAkcmVtYWluaW5nKSkgewoJCQkkcmVjTW92ZWQgPSBnZXRGdW5jdGlvbigkcmVtYWluaW5nLCAkdG1wQXJncyk7CgkJCQoJCQkkcmVtYWluaW5nID0gc3Vic3RyKCRyZW1haW5pbmcsICRyZWNNb3ZlZCk7CgkJCSRtb3ZlZCArPSAkcmVjTW92ZWQ7CgkJfQoJCQoJCSRyZW1haW5pbmcgPSBzdWJzdHIoJHJlbWFpbmluZywgMSk7CgkJJG1vdmVkICs9IDE7CgkJCgkJZm9yZWFjaCgkdG1wQXJncyBhcyAkYXJnKSB7CgkJCWlmKCRhcmdbJ3R5cGUnXSA9PSAnY2FsbCcpIHsKCQkJCSRyZXN1bHRbJ2FyZ3MnXVtdID0gJGFyZzsKCQkJfSBlbHNlIHsKCQkJCWVjaG8gc3ByaW50ZignUGFyc2luZyBjb250ZW50IGFzIGFyZ3MgIiVzIicgLiAiXG4iLCAkYXJnWydjb250ZW50J10pOwoJCQkJZm9yZWFjaChleHBsb2RlKCcsJywgJGFyZ1snY29udGVudCddKSBhcyAkaikgewoJCQkJCS8vZWNobyBzcHJpbnRmKCdQYXJzaW5nIGNvbnRlbnQgYXMgYXJncyA9ICIlcyInIC4gIlxuIiwgJGopOwoJCQkJCXByZWdfbWF0Y2goJy9cQVxzKiguKj8pXHMqXFovJywgJGosICRtYXRjaGVzKTsKCQkJCQkvL2VjaG8gc3ByaW50ZignUGFyc2luZyBjb250ZW50IGFzIGFyZ3MgLi4uICIlcyInIC4gIlxuIiwgJG1hdGNoZXNbMV0pOwoJCQkJCWlmKCRtYXRjaGVzWzFdKSB7CgkJCQkJCSRyZXN1bHRbJ2FyZ3MnXVtdID0gYXJyYXkoJ3R5cGUnID0+ICdjb250ZW50JywgJ2NvbnRlbnQnID0+ICRtYXRjaGVzWzFdKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCXByZWdfbWF0Y2goJy9cQVteJlwpXSsvJywgJGlucHV0LCAkbWF0Y2hlcyk7CgkJJG1hdGNobGVuZ3RoID0gc3RybGVuKCRtYXRjaGVzWzBdKTsKCQkKCQkvL2VjaG8gc3ByaW50ZignQ29udGVudDogIiVzIicgLiAiXG4iLCAkbWF0Y2hlc1swXSk7CgkJCgkJJHJlc3VsdFsnY29udGVudCddID0gJG1hdGNoZXNbMF07CgkJCgkJJG1vdmVkICs9ICRtYXRjaGxlbmd0aDsKCX0KCQoJJHJlc3VsdHNbXSA9ICRyZXN1bHQ7CgkKCXJldHVybiAkbW92ZWQ7Cn0KCiRpbnB1dCA9IGZnZXRzKFNURElOKTsKCiRyZXN1bHQgPSBhcnJheSgpOwpnZXRGdW5jdGlvbigkaW5wdXQsICRyZXN1bHQpOwoKLy8geW91IGNhbiBub3cgcmVjdXJzaXZlbHkgcGFyc2UgdGhlIHN0cnVjdHVyZSB1c2luZyB5b3VyIG93biBjb2RlCgp2YXJfZHVtcCgkcmVzdWx0KTsKPz4=
JmFtcDtncmFkaWVudCgjMTA3M2I4LCAmYW1wO3NhdHVyYXRlKCMxMDczYjgsIHRlc3QsICZhbXA7Y29vbChhc2QsIDEyMywgMzIxKSwgJmFtcDtkZWVwKCZhbXA7cmVjdXJzaW9uKCZhbXA7aXMoJmFtcDtmdW4oLCAxMCwgOSksIDgsIDcpLCA2KSksIDQwKSwgYXdlc29tZSBncmFkaWVudCk7
&gradient(#1073b8, &saturate(#1073b8, test, &cool(asd, 123, 321), &deep(&recursion(&is(&fun(, 10, 9), 8, 7), 6)), 40), awesome gradient);
Parsing content as args "asd, 123, 321"
Parsing content as args ", 10, 9"
Parsing content as args ", 8, 7"
Parsing content as args ", 6"
Parsing content as args "#1073b8, test, "
Parsing content as args ", "
Parsing content as args ", 40"
Parsing content as args "#1073b8, "
Parsing content as args ", awesome gradient"
array(1) {
[0]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(8) "gradient"
["args"]=>
array(3) {
[0]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(7) "#1073b8"
}
[1]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(8) "saturate"
["args"]=>
array(5) {
[0]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(7) "#1073b8"
}
[1]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(4) "test"
}
[2]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(4) "cool"
["args"]=>
array(3) {
[0]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(3) "asd"
}
[1]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(3) "123"
}
[2]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(3) "321"
}
}
}
[3]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(4) "deep"
["args"]=>
array(1) {
[0]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(9) "recursion"
["args"]=>
array(2) {
[0]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(2) "is"
["args"]=>
array(3) {
[0]=>
array(3) {
["type"]=>
string(4) "call"
["name"]=>
string(3) "fun"
["args"]=>
array(2) {
[0]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(2) "10"
}
[1]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(1) "9"
}
}
}
[1]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(1) "8"
}
[2]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(1) "7"
}
}
}
[1]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(1) "6"
}
}
}
}
}
[4]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(2) "40"
}
}
}
[2]=>
array(2) {
["type"]=>
string(7) "content"
["content"]=>
string(16) "awesome gradient"
}
}
}
}