public static function split($string)
{
$string = trim($string);
if (empty($string)) {
return [];
}
$result = [];
$spacer = '@@@REX_SPACER@@@';
$quoted = [];
$pattern = '@(["\'])((?:.*[^\\\\])?(?:\\\\\\\\)*)\\1@Us';
$callback = function ($match) use($spacer, &$quoted) {
$quoted[] = str_replace(['\\' . $match[1], '\\\\'], [$match[1], '\\'], $match[2]);
return $spacer;
};
$string = preg_replace_callback($pattern, $callback, $string);
$parts = preg_split('@\\s+@', $string);
$i = 0;
foreach ($parts as $part) {
$part = explode('=', $part, 2);
if (isset($part[1])) {
$value = $part[1] == $spacer ? $quoted[$i++] : $part[1];
$result[$part[0]] = $value;
} else {
$value = $part[0] == $spacer ? $quoted[$i++] : $part[0];
$result[] = $value;
}
}
return $result;
}