1<?php 2 3namespace GuzzleHttp\Psr7; 4 5final class Header 6{ 7 /** 8 * Parse an array of header values containing ";" separated data into an 9 * array of associative arrays representing the header key value pair data 10 * of the header. When a parameter does not contain a value, but just 11 * contains a key, this function will inject a key with a '' string value. 12 * 13 * @param string|array $header Header to parse into components. 14 * 15 * @return array Returns the parsed header values. 16 */ 17 public static function parse($header) 18 { 19 static $trimmed = "\"' \n\t\r"; 20 $params = $matches = []; 21 22 foreach (self::normalize($header) as $val) { 23 $part = []; 24 foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { 25 if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { 26 $m = $matches[0]; 27 if (isset($m[1])) { 28 $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); 29 } else { 30 $part[] = trim($m[0], $trimmed); 31 } 32 } 33 } 34 if ($part) { 35 $params[] = $part; 36 } 37 } 38 39 return $params; 40 } 41 42 /** 43 * Converts an array of header values that may contain comma separated 44 * headers into an array of headers with no comma separated values. 45 * 46 * @param string|array $header Header to normalize. 47 * 48 * @return array Returns the normalized header field values. 49 */ 50 public static function normalize($header) 51 { 52 if (!is_array($header)) { 53 return array_map('trim', explode(',', $header)); 54 } 55 56 $result = []; 57 foreach ($header as $value) { 58 foreach ((array) $value as $v) { 59 if (strpos($v, ',') === false) { 60 $result[] = $v; 61 continue; 62 } 63 foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { 64 $result[] = trim($vv); 65 } 66 } 67 } 68 69 return $result; 70 } 71} 72