/** * Parses a RFC 2616 content negotiation header field by evaluating the Quality * Values and splitting the options into an array list, ordered by user preference. * * @param string $rawValues 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 array($typeAndQuality[0], isset($typeAndQuality[1]) ? (double) $typeAndQuality[1] : ''); }, preg_split('/,\\s*/', $rawValues)); $flattenedAcceptedTypes = array(); $valuesWithoutQualityValue = array(array(), array(), array(), array()); foreach ($acceptedTypes as $typeAndQuality) { if ($typeAndQuality[1] === '') { $parsedType = Request::parseMediaType($typeAndQuality[0]); if ($parsedType['type'] === '*') { $valuesWithoutQualityValue[3][$typeAndQuality[0]] = TRUE; } elseif ($parsedType['subtype'] === '*') { $valuesWithoutQualityValue[2][$typeAndQuality[0]] = TRUE; } elseif ($parsedType['parameters'] === array()) { $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; }