protected static function expandMatch(array $matches)
{
$parsed = self::parseExpression($matches[1]);
$replacements = [];
$prefix = $parsed['operator'];
$separator = $parsed['operator'];
$queryStringShouldBeUsed = false;
switch ($parsed['operator']) {
case '?':
$separator = '&';
$queryStringShouldBeUsed = true;
break;
case '#':
$separator = ',';
break;
case '&':
case ';':
$queryStringShouldBeUsed = true;
break;
case '+':
case '':
$separator = ',';
$prefix = '';
break;
}
foreach ($parsed['values'] as $value) {
if (!array_key_exists($value['value'], self::$variables) || self::$variables[$value['value']] === null) {
continue;
}
$variable = self::$variables[$value['value']];
$useQueryString = $queryStringShouldBeUsed;
if (is_array($variable)) {
$expanded = self::encodeArrayVariable($variable, $value, $parsed['operator'], $separator, $useQueryString);
} else {
if ($value['modifier'] === ':') {
$variable = substr($variable, 0, $value['position']);
}
$expanded = rawurlencode($variable);
if ($parsed['operator'] === '+' || $parsed['operator'] === '#') {
$expanded = self::decodeReservedDelimiters($expanded);
}
}
if ($useQueryString) {
if ($expanded === '' && $separator !== '&') {
$expanded = $value['value'];
} else {
$expanded = $value['value'] . '=' . $expanded;
}
}
$replacements[] = $expanded;
}
$result = implode($separator, $replacements);
if ($result !== '' && $prefix !== '') {
return $prefix . $result;
}
return $result;
}