Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
QueryParser.php
001 <?php
002 namespace GuzzleHttp;
003
004 /**
005 * Parses query strings into a Query object.
006 *
007 * While parsing, the parser will attempt to determine the most appropriate
008 * query string aggregator to use when serializing the parsed query string
009 * object back into a string. The hope is that parsing then serializing a
010 * query string should be a lossless operation.
011 *
012 * @internal Use Query::fromString()
013 */
014 class QueryParser
015 {
016 private $duplicates;
017 private $numericIndices;
018
019 /**
020 * Parse a query string into a Query object.
021 *
022 * @param Query $query Query object to populate
023 * @param string $str Query string to parse
024 * @param bool|string $urlEncoding How the query string is encoded
025 */
026 public function parseInto(Query $query, $str, $urlEncoding = true)
027 {
028 if ($str === '') {
029 return;
030 }
031
032 $result = [];
033 $this->duplicates = false;
034 $this->numericIndices = true;
035 $decoder = self::getDecoder($urlEncoding);
036
037 foreach (explode('&', $str) as $kvp) {
038
039 $parts = explode('=', $kvp, 2);
040 $key = $decoder($parts[0]);
041 $value = isset($parts[1]) ? $decoder($parts[1]) : null;
042
043 // Special handling needs to be taken for PHP nested array syntax
044 if (strpos($key, '[') !== false) {
045 $this->parsePhpValue($key, $value, $result);
046 continue;
047 }
048
049 if (!isset($result[$key])) {
050 $result[$key] = $value;
051 } else {
052 $this->duplicates = true;
053 if (!is_array($result[$key])) {
054 $result[$key] = [$result[$key]];
055 }
056 $result[$key][] = $value;
057 }
058 }
059
060 $query->replace($result);
061
062 if (!$this->numericIndices) {
063 $query->setAggregator(Query::phpAggregator(false));
064 } elseif ($this->duplicates) {
065 $query->setAggregator(Query::duplicateAggregator());
066 }
067 }
068
069 /**
070 * Returns a callable that is used to URL decode query keys and values.
071 *
072 * @param string|bool $type One of true, false, RFC3986, and RFC1738
073 *
074 * @return callable|string
075 */
076 private static function getDecoder($type)
077 {
078 if ($type === true) {
079 return function ($value) {
080 return rawurldecode(str_replace('+', ' ', $value));
081 };
082 } elseif ($type == Query::RFC3986) {
083 return 'rawurldecode';
084 } elseif ($type == Query::RFC1738) {
085 return 'urldecode';
086 } else {
087 return function ($str) { return $str; };
088 }
089 }
090
091 /**
092 * Parses a PHP style key value pair.
093 *
094 * @param string $key Key to parse (e.g., "foo[a][b]")
095 * @param string|null $value Value to set
096 * @param array $result Result to modify by reference
097 */
098 private function parsePhpValue($key, $value, array &$result)
099 {
100 $node =& $result;
101 $keyBuffer = '';
102
103 for ($i = 0, $t = strlen($key); $i < $t; $i++) {
104 switch ($key[$i]) {
105 case '[':
106 if ($keyBuffer) {
107 $this->prepareNode($node, $keyBuffer);
108 $node =& $node[$keyBuffer];
109 $keyBuffer = '';
110 }
111 break;
112 case ']':
113 $k = $this->cleanKey($node, $keyBuffer);
114 $this->prepareNode($node, $k);
115 $node =& $node[$k];
116 $keyBuffer = '';
117 break;
118 default:
119 $keyBuffer .= $key[$i];
120 break;
121 }
122 }
123
124 if (isset($node)) {
125 $this->duplicates = true;
126 $node[] = $value;
127 } else {
128 $node = $value;
129 }
130 }
131
132 /**
133 * Prepares a value in the array at the given key.
134 *
135 * If the key already exists, the key value is converted into an array.
136 *
137 * @param array $node Result node to modify
138 * @param string $key Key to add or modify in the node
139 */
140 private function prepareNode(&$node, $key)
141 {
142 if (!isset($node[$key])) {
143 $node[$key] = null;
144 } elseif (!is_array($node[$key])) {
145 $node[$key] = [$node[$key]];
146 }
147 }
148
149 /**
150 * Returns the appropriate key based on the node and key.
151 */
152 private function cleanKey($node, $key)
153 {
154 if ($key === '') {
155 $key = $node ? (string) count($node) : 0;
156 // Found a [] key, so track this to ensure that we disable numeric
157 // indexing of keys in the resolved query aggregator.
158 $this->numericIndices = false;
159 }
160
161 return $key;
162 }
163 }
164