public static parseContentNegotiationQualityValues ( string $rawValues ) : array | ||
$rawValues | string | The raw Accept* Header field value |
return | array | The parsed list of field values, ordered by user preference |
public static function parseContentNegotiationQualityValues($rawValues)
{
$acceptedTypes = array_map(function ($acceptType) {
$typeAndQuality = preg_split('/;\\s*q=/', $acceptType);
return [$typeAndQuality[0], isset($typeAndQuality[1]) ? (double) $typeAndQuality[1] : ''];
}, preg_split('/,\\s*/', $rawValues));
$flattenedAcceptedTypes = [];
$valuesWithoutQualityValue = [[], [], [], []];
foreach ($acceptedTypes as $typeAndQuality) {
if ($typeAndQuality[1] === '') {
$parsedType = MediaTypes::parseMediaType($typeAndQuality[0]);
if ($parsedType['type'] === '*') {
$valuesWithoutQualityValue[3][$typeAndQuality[0]] = true;
} elseif ($parsedType['subtype'] === '*') {
$valuesWithoutQualityValue[2][$typeAndQuality[0]] = true;
} elseif ($parsedType['parameters'] === []) {
$valuesWithoutQualityValue[1][$typeAndQuality[0]] = true;
} else {
$valuesWithoutQualityValue[0][$typeAndQuality[0]] = true;
}
} else {
$flattenedAcceptedTypes[$typeAndQuality[0]] = $typeAndQuality[1];
}
}
$valuesWithoutQualityValue = array_merge(array_keys($valuesWithoutQualityValue[0]), array_keys($valuesWithoutQualityValue[1]), array_keys($valuesWithoutQualityValue[2]), array_keys($valuesWithoutQualityValue[3]));
arsort($flattenedAcceptedTypes);
$parsedValues = array_merge($valuesWithoutQualityValue, array_keys($flattenedAcceptedTypes));
return $parsedValues;
}