<?php
$input = "'54\",\"34',34,\"ab,ac\",10,20";
echo "<pre>$input\n\n";var_dump(my_parser
($input)); echo "</pre>\n\n"; $input = "ab$,wdf;tt5,4h56;73t2";
echo "<pre>$input\n\n";var_dump(my_parser
($input)); echo "</pre>\n\n"; $input = "'54\",\"'6'34',34,,\"ab,ac\",10,20";
echo "<pre>$input\n\n";var_dump(my_parser
($input)); echo "</pre>\n\n";
function my_parser($input)
{
$delimeters = [',', ';'];
$quotes = ['"', '\''];
$currentQuote = null;
$currentArg = '';
$args = [];
for ($i=0; $i<$len; $i++) {
$currentSymbol = $input[$i];
if (!empty($currentQuote)) { // we're in quotes if ($currentQuote === $currentSymbol) { // and quote matched
$currentQuote = null; // so quote closed!
} else { // quoted quote, lol
$currentArg .= $currentSymbol; // let it go, it's string
}
} else { // not in quotes
if (in_array($currentSymbol, $quotes)) { // check if symbol is quote $currentQuote = $currentSymbol; // and remember this quote
} elseif (in_array($currentSymbol, $delimeters)) { // check for delimeter $args[] = $currentArg; // it's end of valid argument, yeah!
$currentArg = '';
}
} else { // simple symbol, pass it
$currentArg .= $currentSymbol; // let it go, it's string
}
}
}
$args[] = $currentArg;
}
return $args;
}
PD9waHAKCiRpbnB1dCA9ICInNTRcIixcIjM0JywzNCxcImFiLGFjXCIsMTAsMjAiOwplY2hvICI8cHJlPiRpbnB1dFxuXG4iO3Zhcl9kdW1wKG15X3BhcnNlcigkaW5wdXQpKTsgZWNobyAiPC9wcmU+XG5cbiI7IAokaW5wdXQgPSAiYWIkLHdkZjt0dDUsNGg1Njs3M3QyIjsKZWNobyAiPHByZT4kaW5wdXRcblxuIjt2YXJfZHVtcChteV9wYXJzZXIoJGlucHV0KSk7IGVjaG8gIjwvcHJlPlxuXG4iOyAKJGlucHV0ID0gIic1NFwiLFwiJzYnMzQnLDM0LCxcImFiLGFjXCIsMTAsMjAiOwplY2hvICI8cHJlPiRpbnB1dFxuXG4iO3Zhcl9kdW1wKG15X3BhcnNlcigkaW5wdXQpKTsgZWNobyAiPC9wcmU+XG5cbiI7IAoKZnVuY3Rpb24gbXlfcGFyc2VyKCRpbnB1dCkKewoJJGRlbGltZXRlcnMgPSBbJywnLCAnOyddOwoJJHF1b3RlcyA9IFsnIicsICdcJyddOwoJJGN1cnJlbnRRdW90ZSA9IG51bGw7CgkkY3VycmVudEFyZyA9ICcnOwoJJGFyZ3MgPSBbXTsKCQoJJGxlbiA9IHN0cmxlbigkaW5wdXQpOwoJZm9yICgkaT0wOyAkaTwkbGVuOyAkaSsrKSB7CgkJJGN1cnJlbnRTeW1ib2wgPSAkaW5wdXRbJGldOwoJCQoJCWlmICghZW1wdHkoJGN1cnJlbnRRdW90ZSkpIHsgLy8gd2UncmUgaW4gcXVvdGVzCgkJCWlmICgkY3VycmVudFF1b3RlID09PSAkY3VycmVudFN5bWJvbCkgeyAvLyBhbmQgcXVvdGUgbWF0Y2hlZAoJCQkJJGN1cnJlbnRRdW90ZSA9IG51bGw7IC8vIHNvIHF1b3RlIGNsb3NlZCEKCQkJfSBlbHNlIHsgLy8gcXVvdGVkIHF1b3RlLCBsb2wKCQkJCSRjdXJyZW50QXJnIC49ICRjdXJyZW50U3ltYm9sOyAvLyBsZXQgaXQgZ28sIGl0J3Mgc3RyaW5nCgkJCX0KCQl9IGVsc2UgeyAvLyBub3QgaW4gcXVvdGVzCgkJCWlmIChpbl9hcnJheSgkY3VycmVudFN5bWJvbCwgJHF1b3RlcykpIHsgLy8gY2hlY2sgaWYgc3ltYm9sIGlzIHF1b3RlCgkJCQkkY3VycmVudFF1b3RlID0gJGN1cnJlbnRTeW1ib2w7IC8vIGFuZCByZW1lbWJlciB0aGlzIHF1b3RlCgkJCX0gZWxzZWlmIChpbl9hcnJheSgkY3VycmVudFN5bWJvbCwgJGRlbGltZXRlcnMpKSB7IC8vIGNoZWNrIGZvciBkZWxpbWV0ZXIKCQkJCWlmIChzdHJsZW4oJGN1cnJlbnRBcmcpKSB7CgkJCQkJJGFyZ3NbXSA9ICRjdXJyZW50QXJnOyAvLyBpdCdzIGVuZCBvZiB2YWxpZCBhcmd1bWVudCwgeWVhaCEKCQkJCQkkY3VycmVudEFyZyA9ICcnOwoJCQkJfQoJCQl9IGVsc2UgeyAvLyBzaW1wbGUgc3ltYm9sLCBwYXNzIGl0CgkJCQkkY3VycmVudEFyZyAuPSAkY3VycmVudFN5bWJvbDsgLy8gbGV0IGl0IGdvLCBpdCdzIHN0cmluZwoJCQl9CgkJfQoJfQoJaWYgKHN0cmxlbigkY3VycmVudEFyZykpIHsKCQkkYXJnc1tdID0gJGN1cnJlbnRBcmc7Cgl9CglyZXR1cm4gJGFyZ3M7Cn0K
<pre>'54","34',34,"ab,ac",10,20
array(5) {
[0]=>
string(7) "54","34"
[1]=>
string(2) "34"
[2]=>
string(5) "ab,ac"
[3]=>
string(2) "10"
[4]=>
string(2) "20"
}
</pre>
<pre>ab$,wdf;tt5,4h56;73t2
array(5) {
[0]=>
string(3) "ab$"
[1]=>
string(3) "wdf"
[2]=>
string(3) "tt5"
[3]=>
string(4) "4h56"
[4]=>
string(4) "73t2"
}
</pre>
<pre>'54","'6'34',34,,"ab,ac",10,20
array(5) {
[0]=>
string(8) "54","634"
[1]=>
string(2) "34"
[2]=>
string(5) "ab,ac"
[3]=>
string(2) "10"
[4]=>
string(2) "20"
}
</pre>