Subversion Repositories Applications.framework

Rev

Rev 467 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 467 Rev 476
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
* classe Url, gérant le découpage des paramètres, leurs modification etc...
4
 * classe Url, gérant le découpage des paramètres, leurs modification etc...
5
* Traduction et conversion d'une classe (NET_Url2) issue de Pear
5
 * Traduction et conversion d'une classe (NET_Url2) issue de Pear
6
*
6
 *
7
* @category  Php5
7
 * @category	PHP 5.2
8
* @package   Framework
8
 * @package		Framework
9
// Auteur principal
-
 
10
* @author	Christian Schmidt <schmidt@php.net>
9
 * @author		Christian SCHMIDT<schmidt@php.net>
11
// Autre auteurs
-
 
12
* @author	Aurélien PERONNET <aurelien@tela-botanica.org>
10
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
13
* @author	Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
14
* @copyright 2009 Tela-Botanica
12
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
15
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
-
 
16
* @license   http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @license		GNU-GPL-v3 <http://www.gnu.org/licenses/gpl.html>
17
* @version   SVN: $Id: Url.php 171 2010-03-23 11:23:38Z jpm $
14
 * @license		CECILL-v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
18
* @link	  /doc/framework/
-
 
19
*
-
 
20
*/
15
 */
21
class Url
16
class Url
22
{
17
{
23
	/**
18
	/**
24
	 * Parsing strict dans resoudre() (voir RFC 3986, section 5.2.2). Par défaut
19
	 * Parsing strict dans resoudre() (voir RFC 3986, section 5.2.2). Par défaut
25
	 * à true.
20
	 * à true.
26
	 */
21
	 */
27
	const OPTION_STRICTE = 'strict';
22
	const OPTION_STRICTE = 'strict';
28
 
23
 
29
	/**
24
	/**
30
	 * Répresenter les tableaux dans les requêtes en utilisant la notation php []. Par défaut à true.
25
	 * Répresenter les tableaux dans les requêtes en utilisant la notation php []. Par défaut à true.
31
	 */
26
	 */
32
	const OPTION_UTILISER_CROCHETS = 'use_brackets';
27
	const OPTION_UTILISER_CROCHETS = 'use_brackets';
33
 
28
 
34
	/**
29
	/**
35
	 * URL-encoder les clés des variables dans les requêtes. Par défaut à true.
30
	 * URL-encoder les clés des variables dans les requêtes. Par défaut à true.
36
	 */
31
	 */
37
	const OPTION_ENCODER_CLES = 'encode_keys';
32
	const OPTION_ENCODER_CLES = 'encode_keys';
38
 
33
 
39
	/**
34
	/**
40
	 * Séparateurs de variables lors du parsing de la requête. Chaque caractère
35
	 * Séparateurs de variables lors du parsing de la requête. Chaque caractère
41
	 * est considéré comme un séparateur. Par défaut, spécifié par le paramêtre
36
	 * est considéré comme un séparateur. Par défaut, spécifié par le paramêtre
42
	 * arg_separator.input dans php.ini (par défaut "&").
37
	 * arg_separator.input dans php.ini (par défaut "&").
43
	 */
38
	 */
44
	const OPTION_SEPARATEUR_ENTREE = 'input_separator';
39
	const OPTION_SEPARATEUR_ENTREE = 'input_separator';
45
 
40
 
46
	/**
41
	/**
47
	 * Séparateur de variables lors de la génération de la requête. Par défaut, spécifié
42
	 * Séparateur de variables lors de la génération de la requête. Par défaut, spécifié
48
	 * par le paramètre arg_separator.output dans php.ini (par défaut "&").
43
	 * par le paramètre arg_separator.output dans php.ini (par défaut "&").
49
	 */
44
	 */
50
	const OPTION_SEPARATEUR_SORTIE = 'output_separator';
45
	const OPTION_SEPARATEUR_SORTIE = 'output_separator';
51
 
46
 
52
	/**
47
	/**
53
	 * Options par défaut correspondant au comportement de php
48
	 * Options par défaut correspondant au comportement de php
54
	 * vis à vis de $_GET
49
	 * vis à vis de $_GET
55
	 */
50
	 */
56
	private $options = array(
51
	private $options = array(
57
		self::OPTION_STRICTE => true,
52
		self::OPTION_STRICTE => true,
58
		self::OPTION_UTILISER_CROCHETS => true,
53
		self::OPTION_UTILISER_CROCHETS => true,
59
		self::OPTION_ENCODER_CLES => true,
54
		self::OPTION_ENCODER_CLES => true,
60
		self::OPTION_SEPARATEUR_ENTREE => 'x&',
55
		self::OPTION_SEPARATEUR_ENTREE => 'x&',
61
		self::OPTION_SEPARATEUR_SORTIE => 'x&');
56
		self::OPTION_SEPARATEUR_SORTIE => 'x&');
62
 
57
 
63
	/**
58
	/**
64
	 * @var  string|bool
59
	 * @var  string|bool
65
	 */
60
	 */
66
	private $schema = false;
61
	private $schema = false;
67
 
62
 
68
	/**
63
	/**
69
	 * @var  string|bool
64
	 * @var  string|bool
70
	 */
65
	 */
71
	private $infoUtilisateur = false;
66
	private $infoUtilisateur = false;
72
 
67
 
73
	/**
68
	/**
74
	 * @var  string|bool
69
	 * @var  string|bool
75
	 */
70
	 */
76
	private $hote = false;
71
	private $hote = false;
77
 
72
 
78
	/**
73
	/**
79
	 * @var  int|bool
74
	 * @var  int|bool
80
	 */
75
	 */
81
	private $port = false;
76
	private $port = false;
82
 
77
 
83
	/**
78
	/**
84
	 * @var  string
79
	 * @var  string
85
	 */
80
	 */
86
	private $chemin = '';
81
	private $chemin = '';
87
 
82
 
88
	/**
83
	/**
89
	 * @var  string|bool
84
	 * @var  string|bool
90
	 */
85
	 */
91
	private $requete = false;
86
	private $requete = false;
92
 
87
 
93
	/**
88
	/**
94
	 * @var  string|bool
89
	 * @var  string|bool
95
	 */
90
	 */
96
	private $fragment = false;
91
	private $fragment = false;
97
 
92
 
98
	/**
93
	/**
99
	 * @param string $url	 une URL relative ou absolue
94
	 * @param string $url	 une URL relative ou absolue
100
	 * @param array  $options
95
	 * @param array  $options
101
	 */
96
	 */
102
	public function __construct($url, $options = null) {
97
	public function __construct($url, $options = null) {
103
		$this->setOption(self::OPTION_SEPARATEUR_ENTREE,
98
		$this->setOption(self::OPTION_SEPARATEUR_ENTREE,
104
						 Config::get('fw_url_arg_separateur_entree'));
99
						 Config::get('fw_url_arg_separateur_entree'));
105
		$this->setOption(self::OPTION_SEPARATEUR_SORTIE,
100
		$this->setOption(self::OPTION_SEPARATEUR_SORTIE,
106
						 Config::get('fw_url_arg_separateur_sortie'));
101
						 Config::get('fw_url_arg_separateur_sortie'));
107
		if (is_array($options)) {
102
		if (is_array($options)) {
108
			foreach ($options as $nomOption => $valeur) {
103
			foreach ($options as $nomOption => $valeur) {
109
				$this->setOption($nomOption);
104
				$this->setOption($nomOption);
110
			}
105
			}
111
		}
106
		}
112
 
107
 
113
		if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) {
108
		if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) {
114
			$this->schema = $reg[1];
109
			$this->schema = $reg[1];
115
			$url = substr($url, strlen($reg[0]));
110
			$url = substr($url, strlen($reg[0]));
116
		}
111
		}
117
 
112
 
118
		if (preg_match('@^//([^/#?]+)@', $url, $reg)) {
113
		if (preg_match('@^//([^/#?]+)@', $url, $reg)) {
119
			$this->setAutorite($reg[1]);
114
			$this->setAutorite($reg[1]);
120
			$url = substr($url, strlen($reg[0]));
115
			$url = substr($url, strlen($reg[0]));
121
		}
116
		}
122
 
117
 
123
		$i = strcspn($url, '?#');
118
		$i = strcspn($url, '?#');
124
		$this->chemin = substr($url, 0, $i);
119
		$this->chemin = substr($url, 0, $i);
125
		$url = substr($url, $i);
120
		$url = substr($url, $i);
126
 
121
 
127
		if (preg_match('@^\?([^#]*)@', $url, $reg)) {
122
		if (preg_match('@^\?([^#]*)@', $url, $reg)) {
128
			$this->requete = $reg[1];
123
			$this->requete = $reg[1];
129
			$url = substr($url, strlen($reg[0]));
124
			$url = substr($url, strlen($reg[0]));
130
		}
125
		}
131
 
126
 
132
		if ($url) {
127
		if ($url) {
133
			$this->fragment = substr($url, 1);
128
			$this->fragment = substr($url, 1);
134
		}
129
		}
135
	}
130
	}
136
 
131
 
137
	/**
132
	/**
138
	 * Retourne le schéma, c.a.d. "http" ou "urn", ou false si aucun schéma n'est
133
	 * Retourne le schéma, c.a.d. "http" ou "urn", ou false si aucun schéma n'est
139
	 * spécifié, i.e. l'url est une url relative
134
	 * spécifié, i.e. l'url est une url relative
140
	 *
135
	 *
141
	 * @return  string|bool
136
	 * @return  string|bool
142
	 */
137
	 */
143
	public function getSchema() {
138
	public function getSchema() {
144
		return $this->schema;
139
		return $this->schema;
145
	}
140
	}
146
 
141
 
147
	/**
142
	/**
148
	 * @param string|bool $schema
143
	 * @param string|bool $schema
149
	 *
144
	 *
150
	 * @return void
145
	 * @return void
151
	 * @see	getSchema()
146
	 * @see	getSchema()
152
	 */
147
	 */
153
	public function setSchema($schema) {
148
	public function setSchema($schema) {
154
		$this->schema = $schema;
149
		$this->schema = $schema;
155
	}
150
	}
156
 
151
 
157
	/**
152
	/**
158
	 * renvoie la partie user de la partie infoUtilisateur (partie précédant le premier
153
	 * renvoie la partie user de la partie infoUtilisateur (partie précédant le premier
159
	 *  ":"), ou false si aucune partie infoUtilisateur n'est définie.
154
	 *  ":"), ou false si aucune partie infoUtilisateur n'est définie.
160
	 *
155
	 *
161
	 * @return  string|bool
156
	 * @return  string|bool
162
	 */
157
	 */
163
	public function getUtilisateur() {
158
	public function getUtilisateur() {
164
		return $this->infoUtilisateur !== false ? preg_replace('@:.*$@', '', $this->infoUtilisateur) : false;
159
		return $this->infoUtilisateur !== false ? preg_replace('@:.*$@', '', $this->infoUtilisateur) : false;
165
	}
160
	}
166
 
161
 
167
	/**
162
	/**
168
	 * renvoie la partie mot de passe de la partie infoUtilisateur (partie après le premier
163
	 * renvoie la partie mot de passe de la partie infoUtilisateur (partie après le premier
169
	 *  ":"), , ou false si aucune partie infoUtilisateur n'est définie (i.e. l'URL ne contient
164
	 *  ":"), , ou false si aucune partie infoUtilisateur n'est définie (i.e. l'URL ne contient
170
	 * pas de "@" en face du nom d'hôte) ou si la partie infoUtilisateur ne contient pas de ":".
165
	 * pas de "@" en face du nom d'hôte) ou si la partie infoUtilisateur ne contient pas de ":".
171
	 *
166
	 *
172
	 * @return  string|bool
167
	 * @return  string|bool
173
	 */
168
	 */
174
	public function getMotDePasse() {
169
	public function getMotDePasse() {
175
		return $this->infoUtilisateur !== false ? substr(strstr($this->infoUtilisateur, ':'), 1) : false;
170
		return $this->infoUtilisateur !== false ? substr(strstr($this->infoUtilisateur, ':'), 1) : false;
176
	}
171
	}
177
 
172
 
178
	/**
173
	/**
179
	 * Renvoie la partie userinfio, ou false si celle-ci n'existe pas, i.e. si la partie
174
	 * Renvoie la partie userinfio, ou false si celle-ci n'existe pas, i.e. si la partie
180
	 * autorité ne contient pas de "@"
175
	 * autorité ne contient pas de "@"
181
	 *
176
	 *
182
	 * @return  string|bool
177
	 * @return  string|bool
183
	 */
178
	 */
184
	public function getInfoUtilisateur() {
179
	public function getInfoUtilisateur() {
185
		return $this->infoUtilisateur;
180
		return $this->infoUtilisateur;
186
	}
181
	}
187
 
182
 
188
	/**
183
	/**
189
	 * Setteur pour la partie infoUtilisateur. Si deux argument sont passé, ils sont combinés
184
	 * Setteur pour la partie infoUtilisateur. Si deux argument sont passé, ils sont combinés
190
	 * dans la partie infoUtilisateur de cette manière username ":" password.
185
	 * dans la partie infoUtilisateur de cette manière username ":" password.
191
	 *
186
	 *
192
	 * @param string|bool $infoUtilisateur infoUtilisateur ou username
187
	 * @param string|bool $infoUtilisateur infoUtilisateur ou username
193
	 * @param string|bool $motDePasse
188
	 * @param string|bool $motDePasse
194
	 *
189
	 *
195
	 * @return void
190
	 * @return void
196
	 */
191
	 */
197
	public function setInfoUtilisateur($infoUtilisateur, $motDePasse = false) {
192
	public function setInfoUtilisateur($infoUtilisateur, $motDePasse = false) {
198
		$this->infoUtilisateur = $infoUtilisateur;
193
		$this->infoUtilisateur = $infoUtilisateur;
199
		if ($motDePasse !== false) {
194
		if ($motDePasse !== false) {
200
			$this->infoUtilisateur .= ':' . $motDePasse;
195
			$this->infoUtilisateur .= ':' . $motDePasse;
201
		}
196
		}
202
	}
197
	}
203
 
198
 
204
	/**
199
	/**
205
	 * Renvoie la partie hôte, ou false s'il n'y a pas de partie autorité, c.a.d.
200
	 * Renvoie la partie hôte, ou false s'il n'y a pas de partie autorité, c.a.d.
206
	 * l'URL est relative.
201
	 * l'URL est relative.
207
	 *
202
	 *
208
	 * @return  string|bool
203
	 * @return  string|bool
209
	 */
204
	 */
210
	public function getHote() {
205
	public function getHote() {
211
		return $this->hote;
206
		return $this->hote;
212
	}
207
	}
213
 
208
 
214
	/**
209
	/**
215
	 * @param string|bool $hote
210
	 * @param string|bool $hote
216
	 *
211
	 *
217
	 * @return void
212
	 * @return void
218
	 */
213
	 */
219
	public function setHote($hote) {
214
	public function setHote($hote) {
220
		$this->hote = $hote;
215
		$this->hote = $hote;
221
	}
216
	}
222
 
217
 
223
	/**
218
	/**
224
	 * Renvoie le numéro de port, ou false si aucun numéro de port n'est spécifié,
219
	 * Renvoie le numéro de port, ou false si aucun numéro de port n'est spécifié,
225
	 * i.e. le port par défaut doit utilisé.
220
	 * i.e. le port par défaut doit utilisé.
226
	 *
221
	 *
227
	 * @return  int|bool
222
	 * @return  int|bool
228
	 */
223
	 */
229
	public function getPort() {
224
	public function getPort() {
230
		return $this->port;
225
		return $this->port;
231
	}
226
	}
232
 
227
 
233
	/**
228
	/**
234
	 * @param int|bool $port
229
	 * @param int|bool $port
235
	 *
230
	 *
236
	 * @return void
231
	 * @return void
237
	 */
232
	 */
238
	public function setPort($port) {
233
	public function setPort($port) {
239
		$this->port = intval($port);
234
		$this->port = intval($port);
240
	}
235
	}
241
 
236
 
242
	/**
237
	/**
243
	 * Renvoie la partie autorité, i.e. [ infoUtilisateur "@" ] hote [ ":" port ], ou
238
	 * Renvoie la partie autorité, i.e. [ infoUtilisateur "@" ] hote [ ":" port ], ou
244
	 * false si celle-ci est absente.
239
	 * false si celle-ci est absente.
245
	 *
240
	 *
246
	 * @return string|bool
241
	 * @return string|bool
247
	 */
242
	 */
248
	public function getAutorite() {
243
	public function getAutorite() {
249
		if (!$this->hote) {
244
		if (!$this->hote) {
250
			return false;
245
			return false;
251
		}
246
		}
252
 
247
 
253
		$autorite = '';
248
		$autorite = '';
254
 
249
 
255
		if ($this->infoUtilisateur !== false) {
250
		if ($this->infoUtilisateur !== false) {
256
			$autorite .= $this->infoUtilisateur . '@';
251
			$autorite .= $this->infoUtilisateur . '@';
257
		}
252
		}
258
 
253
 
259
		$autorite .= $this->hote;
254
		$autorite .= $this->hote;
260
 
255
 
261
		if ($this->port !== false) {
256
		if ($this->port !== false) {
262
			$autorite .= ':' . $this->port;
257
			$autorite .= ':' . $this->port;
263
		}
258
		}
264
 
259
 
265
		return $autorite;
260
		return $autorite;
266
	}
261
	}
267
 
262
 
268
	/**
263
	/**
269
	 * @param string|false $autorite
264
	 * @param string|false $autorite
270
	 *
265
	 *
271
	 * @return void
266
	 * @return void
272
	 */
267
	 */
273
	public function setAutorite($autorite) {
268
	public function setAutorite($autorite) {
274
		$this->user = false;
269
		$this->user = false;
275
		$this->pass = false;
270
		$this->pass = false;
276
		$this->hote = false;
271
		$this->hote = false;
277
		$this->port = false;
272
		$this->port = false;
278
		if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $autorite, $reg)) {
273
		if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $autorite, $reg)) {
279
			if ($reg[1]) {
274
			if ($reg[1]) {
280
				$this->infoUtilisateur = $reg[2];
275
				$this->infoUtilisateur = $reg[2];
281
			}
276
			}
282
 
277
 
283
			$this->hote = $reg[3];
278
			$this->hote = $reg[3];
284
			if (isset($reg[5])) {
279
			if (isset($reg[5])) {
285
				$this->port = intval($reg[5]);
280
				$this->port = intval($reg[5]);
286
			}
281
			}
287
		}
282
		}
288
	}
283
	}
289
 
284
 
290
	/**
285
	/**
291
	 * Renvoie la partie chemin (chemin) (éventuellement vide).
286
	 * Renvoie la partie chemin (chemin) (éventuellement vide).
292
	 *
287
	 *
293
	 * @return string
288
	 * @return string
294
	 */
289
	 */
295
	public function getChemin() {
290
	public function getChemin() {
296
		return $this->chemin;
291
		return $this->chemin;
297
	}
292
	}
298
 
293
 
299
	/**
294
	/**
300
	 * @param string $chemin
295
	 * @param string $chemin
301
	 *
296
	 *
302
	 * @return void
297
	 * @return void
303
	 */
298
	 */
304
	public function setChemin($chemin) {
299
	public function setChemin($chemin) {
305
		$this->chemin = $chemin;
300
		$this->chemin = $chemin;
306
	}
301
	}
307
 
302
 
308
	/**
303
	/**
309
	 * renvoie la chaine de requête (requete string) (sans le premier "?"), ou false si "?"
304
	 * renvoie la chaine de requête (requete string) (sans le premier "?"), ou false si "?"
310
	 * n'est pas présent dans l'url.
305
	 * n'est pas présent dans l'url.
311
	 *
306
	 *
312
	 * @return  string|bool
307
	 * @return  string|bool
313
	 * @see	 self::getVariablesRequete()
308
	 * @see	 self::getVariablesRequete()
314
	 */
309
	 */
315
	public function getRequete() {
310
	public function getRequete() {
316
		return $this->requete;
311
		return $this->requete;
317
	}
312
	}
318
 
313
 
319
	/**
314
	/**
320
	 * @param string|bool $requete
315
	 * @param string|bool $requete
321
	 *
316
	 *
322
	 * @return void
317
	 * @return void
323
	 * @see   self::setVariablesRequete()
318
	 * @see   self::setVariablesRequete()
324
	 */
319
	 */
325
	public function setRequete($requete) {
320
	public function setRequete($requete) {
326
		$this->requete = $requete;
321
		$this->requete = $requete;
327
	}
322
	}
328
 
323
 
329
	/**
324
	/**
330
	 * Renvoie le nom du fragment, ou false si "#" n'est pas present dans l'URL.
325
	 * Renvoie le nom du fragment, ou false si "#" n'est pas present dans l'URL.
331
	 *
326
	 *
332
	 * @return  string|bool
327
	 * @return  string|bool
333
	 */
328
	 */
334
	public function getFragment() {
329
	public function getFragment() {
335
		return $this->fragment;
330
		return $this->fragment;
336
	}
331
	}
337
 
332
 
338
	/**
333
	/**
339
	 * @param string|bool $fragment
334
	 * @param string|bool $fragment
340
	 *
335
	 *
341
	 * @return void
336
	 * @return void
342
	 */
337
	 */
343
	public function setFragment($fragment) {
338
	public function setFragment($fragment) {
344
		$this->fragment = $fragment;
339
		$this->fragment = $fragment;
345
	}
340
	}
346
 
341
 
347
	/**
342
	/**
348
	 * Renvoie la requete string sous forme d'un tableau de variables telles qu'elles apparaitraient
343
	 * Renvoie la requete string sous forme d'un tableau de variables telles qu'elles apparaitraient
349
	 * dans le $_GET d'un script PHP
344
	 * dans le $_GET d'un script PHP
350
	 *
345
	 *
351
	 * @return  array
346
	 * @return  array
352
	 */
347
	 */
353
	public function getVariablesRequete() {
348
	public function getVariablesRequete() {
354
		$pattern = '/' .
349
		$pattern = '/' .
355
				   preg_quote($this->getOption(self::OPTION_SEPARATEUR_ENTREE), '/') .
350
				   preg_quote($this->getOption(self::OPTION_SEPARATEUR_ENTREE), '/') .
356
				   '/';
351
				   '/';
357
		$parties   = preg_split($pattern, $this->requete, -1, PREG_SPLIT_NO_EMPTY);
352
		$parties   = preg_split($pattern, $this->requete, -1, PREG_SPLIT_NO_EMPTY);
358
		$retour  = array();
353
		$retour  = array();
359
 
354
 
360
		foreach ($parties as $partie) {
355
		foreach ($parties as $partie) {
361
			if (strpos($partie, '=') !== false) {
356
			if (strpos($partie, '=') !== false) {
362
				list($cle, $valeur) = explode('=', $partie, 2);
357
				list($cle, $valeur) = explode('=', $partie, 2);
363
			} else {
358
			} else {
364
				$cle   = $partie;
359
				$cle   = $partie;
365
				$valeur = null;
360
				$valeur = null;
366
			}
361
			}
367
 
362
 
368
			if ($this->getOption(self::OPTION_ENCODER_CLES)) {
363
			if ($this->getOption(self::OPTION_ENCODER_CLES)) {
369
				$cle = rawurldecode($cle);
364
				$cle = rawurldecode($cle);
370
			}
365
			}
371
			$valeur = rawurldecode($valeur);
366
			$valeur = rawurldecode($valeur);
372
 
367
 
373
			if ($this->getOption(self::OPTION_UTILISER_CROCHETS) &&
368
			if ($this->getOption(self::OPTION_UTILISER_CROCHETS) &&
374
				preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $cle, $matches)) {
369
				preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $cle, $matches)) {
375
 
370
 
376
				$cle = $matches[1];
371
				$cle = $matches[1];
377
				$idx = $matches[2];
372
				$idx = $matches[2];
378
 
373
 
379
				// On s'assure que c'est bien un tableau
374
				// On s'assure que c'est bien un tableau
380
				if (empty($retour[$cle]) || !is_array($retour[$cle])) {
375
				if (empty($retour[$cle]) || !is_array($retour[$cle])) {
381
					$retour[$cle] = array();
376
					$retour[$cle] = array();
382
				}
377
				}
383
 
378
 
384
				// Ajout des données
379
				// Ajout des données
385
				if ($idx === '') {
380
				if ($idx === '') {
386
					$retour[$cle][] = $valeur;
381
					$retour[$cle][] = $valeur;
387
				} else {
382
				} else {
388
					$retour[$cle][$idx] = $valeur;
383
					$retour[$cle][$idx] = $valeur;
389
				}
384
				}
390
			} elseif (!$this->getOption(self::OPTION_UTILISER_CROCHETS)
385
			} elseif (!$this->getOption(self::OPTION_UTILISER_CROCHETS)
391
					  && !empty($retour[$cle])
386
					  && !empty($retour[$cle])
392
			) {
387
			) {
393
				$retour[$cle]   = (array) $retour[$cle];
388
				$retour[$cle]   = (array) $retour[$cle];
394
				$retour[$cle][] = $valeur;
389
				$retour[$cle][] = $valeur;
395
			} else {
390
			} else {
396
				$retour[$cle] = $valeur;
391
				$retour[$cle] = $valeur;
397
			}
392
			}
398
		}
393
		}
399
 
394
 
400
		return $retour;
395
		return $retour;
401
	}
396
	}
402
 
397
 
403
	/**
398
	/**
404
	 * @param array $tableau (nom => valeur) tableau
399
	 * @param array $tableau (nom => valeur) tableau
405
	 *
400
	 *
406
	 * @return void
401
	 * @return void
407
	 */
402
	 */
408
	public function setVariablesRequete(array $tableau) {
403
	public function setVariablesRequete(array $tableau) {
409
		if (!$tableau) {
404
		if (!$tableau) {
410
			$this->requete = false;
405
			$this->requete = false;
411
		} else {
406
		} else {
412
			foreach ($tableau as $nom => $valeur) {
407
			foreach ($tableau as $nom => $valeur) {
413
				if ($this->getOption(self::OPTION_ENCODER_CLES)) {
408
				if ($this->getOption(self::OPTION_ENCODER_CLES)) {
414
					$nom = rawurlencode($nom);
409
					$nom = rawurlencode($nom);
415
				}
410
				}
416
 
411
 
417
				if (is_array($valeur)) {
412
				if (is_array($valeur)) {
418
					foreach ($valeur as $k => $v) {
413
					foreach ($valeur as $k => $v) {
419
						$parties[] = $this->getOption(self::OPTION_UTILISER_CROCHETS)
414
						$parties[] = $this->getOption(self::OPTION_UTILISER_CROCHETS)
420
							? sprintf('%s[%s]=%s', $nom, $k, $v)
415
							? sprintf('%s[%s]=%s', $nom, $k, $v)
421
							: ($nom . '=' . $v);
416
							: ($nom . '=' . $v);
422
					}
417
					}
423
				} elseif (!is_null($valeur)) {
418
				} elseif (!is_null($valeur)) {
424
					$parties[] = $nom . '=' . $valeur;
419
					$parties[] = $nom . '=' . $valeur;
425
				} else {
420
				} else {
426
					$parties[] = $nom;
421
					$parties[] = $nom;
427
				}
422
				}
428
			}
423
			}
429
			$this->requete = implode($this->getOption(self::OPTION_SEPARATEUR_SORTIE),
424
			$this->requete = implode($this->getOption(self::OPTION_SEPARATEUR_SORTIE),
430
								   $parties);
425
								   $parties);
431
		}
426
		}
432
	}
427
	}
433
 
428
 
434
	/**
429
	/**
435
	 * @param string $nom
430
	 * @param string $nom
436
	 * @param mixed  $valeur
431
	 * @param mixed  $valeur
437
	 *
432
	 *
438
	 * @return  array
433
	 * @return  array
439
	 */
434
	 */
440
	public function setVariableRequete($nom, $valeur) {
435
	public function setVariableRequete($nom, $valeur) {
441
		$tableau = $this->getVariablesRequete();
436
		$tableau = $this->getVariablesRequete();
442
		$tableau[$nom] = $valeur;
437
		$tableau[$nom] = $valeur;
443
		$this->setVariablesRequete($tableau);
438
		$this->setVariablesRequete($tableau);
444
	}
439
	}
445
 
440
 
446
	/**
441
	/**
447
	 * @param string $nom
442
	 * @param string $nom
448
	 *
443
	 *
449
	 * @return void
444
	 * @return void
450
	 */
445
	 */
451
	public function unsetVariableRequete($nom) {
446
	public function unsetVariableRequete($nom) {
452
		$tableau = $this->getVariablesRequete();
447
		$tableau = $this->getVariablesRequete();
453
		unset($tableau[$nom]);
448
		unset($tableau[$nom]);
454
		$this->setVariablesRequete($tableau);
449
		$this->setVariablesRequete($tableau);
455
	}
450
	}
456
	
451
 
457
	/**
452
	/**
458
	 * @param array $noms tableau des noms de variable à supprimer de l'url.
453
	 * @param array $noms tableau des noms de variable à supprimer de l'url.
459
	 *
454
	 *
460
	 * @return void
455
	 * @return void
461
	 */
456
	 */
462
	public function unsetVariablesRequete($noms) {
457
	public function unsetVariablesRequete($noms) {
463
		$tableau = $this->getVariablesRequete();
458
		$tableau = $this->getVariablesRequete();
464
		foreach ($noms as $nom) {
459
		foreach ($noms as $nom) {
465
			unset($tableau[$nom]);
460
			unset($tableau[$nom]);
466
		}
461
		}
467
		$this->setVariablesRequete($tableau);
462
		$this->setVariablesRequete($tableau);
468
	}
463
	}
469
 
464
 
470
	/**
465
	/**
471
	 * Renvoie un représentation sous forme de chaine de l'URL
466
	 * Renvoie un représentation sous forme de chaine de l'URL
472
	 *
467
	 *
473
	 * @return  string
468
	 * @return  string
474
	 */
469
	 */
475
	public function getURL() {
470
	public function getURL() {
476
		// Voir RFC 3986, section 5.3
471
		// Voir RFC 3986, section 5.3
477
		$url = "";
472
		$url = "";
478
 
473
 
479
		if ($this->schema !== false) {
474
		if ($this->schema !== false) {
480
			$url .= $this->schema . ':';
475
			$url .= $this->schema . ':';
481
		}
476
		}
482
 
477
 
483
		$autorite = $this->getAutorite();
478
		$autorite = $this->getAutorite();
484
		if ($autorite !== false) {
479
		if ($autorite !== false) {
485
			$url .= '//' . $autorite;
480
			$url .= '//' . $autorite;
486
		}
481
		}
487
		$url .= $this->chemin;
482
		$url .= $this->chemin;
488
 
483
 
489
		if ($this->requete !== false) {
484
		if ($this->requete !== false) {
490
			$url .= '?' . $this->requete;
485
			$url .= '?' . $this->requete;
491
		}
486
		}
492
 
487
 
493
		if ($this->fragment !== false) {
488
		if ($this->fragment !== false) {
494
			$url .= '#' . $this->fragment;
489
			$url .= '#' . $this->fragment;
495
		}
490
		}
496
 
491
 
497
		return $url;
492
		return $url;
498
	}
493
	}
499
 
494
 
500
	/**
495
	/**
501
	 * Renvoie une représentation de cette URL sous forme de chaine normalisée. Utile pour la
496
	 * Renvoie une représentation de cette URL sous forme de chaine normalisée. Utile pour la
502
	 * comparaison d'URLs
497
	 * comparaison d'URLs
503
	 *
498
	 *
504
	 * @return  string
499
	 * @return  string
505
	 */
500
	 */
506
	public function getURLNormalisee() {
501
	public function getURLNormalisee() {
507
		$url = clone $this;
502
		$url = clone $this;
508
		$url->normaliser();
503
		$url->normaliser();
509
		return $url->getUrl();
504
		return $url->getUrl();
510
	}
505
	}
511
 
506
 
512
	/**
507
	/**
513
	 * Renvoie une instance normalisée de Url
508
	 * Renvoie une instance normalisée de Url
514
	 *
509
	 *
515
	 * @return  Url
510
	 * @return  Url
516
	 */
511
	 */
517
	public function normaliser() {
512
	public function normaliser() {
518
		// See RFC 3886, section 6
513
		// See RFC 3886, section 6
519
 
514
 
520
		// les cchémas sont insesibles à la casse
515
		// les cchémas sont insesibles à la casse
521
		if ($this->schema) {
516
		if ($this->schema) {
522
			$this->schema = strtolower($this->schema);
517
			$this->schema = strtolower($this->schema);
523
		}
518
		}
524
 
519
 
525
		// les noms d'hotes sont insensibles à la casse
520
		// les noms d'hotes sont insensibles à la casse
526
		if ($this->hote) {
521
		if ($this->hote) {
527
			$this->hote = strtolower($this->hote);
522
			$this->hote = strtolower($this->hote);
528
		}
523
		}
529
 
524
 
530
		// Supprimer le numéro de port par défaut pour les schemas connus (RFC 3986, section 6.2.3)
525
		// Supprimer le numéro de port par défaut pour les schemas connus (RFC 3986, section 6.2.3)
531
		if ($this->port &&
526
		if ($this->port &&
532
			$this->schema &&
527
			$this->schema &&
533
			$this->port == getservbyname($this->schema, 'tcp')) {
528
			$this->port == getservbyname($this->schema, 'tcp')) {
534
 
529
 
535
			$this->port = false;
530
			$this->port = false;
536
		}
531
		}
537
 
532
 
538
		// normalisation dans le cas d'un encodage avec %XX pourcentage (RFC 3986, section 6.2.2.1)
533
		// normalisation dans le cas d'un encodage avec %XX pourcentage (RFC 3986, section 6.2.2.1)
539
		foreach (array('infoUtilisateur', 'hote', 'chemin') as $partie) {
534
		foreach (array('infoUtilisateur', 'hote', 'chemin') as $partie) {
540
			if ($this->$partie) {
535
			if ($this->$partie) {
541
				$this->$partie  = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$partie);
536
				$this->$partie  = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$partie);
542
			}
537
			}
543
		}
538
		}
544
 
539
 
545
		// normalisation des segments du chemin (RFC 3986, section 6.2.2.3)
540
		// normalisation des segments du chemin (RFC 3986, section 6.2.2.3)
546
		$this->chemin = self::supprimerSegmentsAPoints($this->chemin);
541
		$this->chemin = self::supprimerSegmentsAPoints($this->chemin);
547
 
542
 
548
		// normalisation basée sur le schéma (RFC 3986, section 6.2.3)
543
		// normalisation basée sur le schéma (RFC 3986, section 6.2.3)
549
		if ($this->hote && !$this->chemin) {
544
		if ($this->hote && !$this->chemin) {
550
			$this->chemin = '/';
545
			$this->chemin = '/';
551
		}
546
		}
552
	}
547
	}
553
 
548
 
554
	/**
549
	/**
555
	 * Renvoie vrai ou faux suivant que l'instance en cours représente une URL relative ou absolue.
550
	 * Renvoie vrai ou faux suivant que l'instance en cours représente une URL relative ou absolue.
556
	 *
551
	 *
557
	 * @return  bool
552
	 * @return  bool
558
	 */
553
	 */
559
	public function etreAbsolue() {
554
	public function etreAbsolue() {
560
		return (bool) $this->schema;
555
		return (bool) $this->schema;
561
	}
556
	}
562
 
557
 
563
	/**
558
	/**
564
	 * Renvoie une instance de Url représentant une URL absolue relative à
559
	 * Renvoie une instance de Url représentant une URL absolue relative à
565
	 * cette URL.
560
	 * cette URL.
566
	 *
561
	 *
567
	 * @param Url|string $reference URL relative
562
	 * @param Url|string $reference URL relative
568
	 *
563
	 *
569
	 * @return Url
564
	 * @return Url
570
	 */
565
	 */
571
	public function resoudre($reference) {
566
	public function resoudre($reference) {
572
		if (is_string($reference)) {
567
		if (is_string($reference)) {
573
			$reference = new self($reference);
568
			$reference = new self($reference);
574
		}
569
		}
575
		if (!$this->etreAbsolue()) {
570
		if (!$this->etreAbsolue()) {
576
			throw new Exception('L\'URL de base doit être absolue !');
571
			throw new Exception('L\'URL de base doit être absolue !');
577
		}
572
		}
578
 
573
 
579
		// Un parseur non strict peut choisir d'ignorer un schema dans la référence
574
		// Un parseur non strict peut choisir d'ignorer un schema dans la référence
580
		// si celui ci est identique au schéma de base de l'URI.
575
		// si celui ci est identique au schéma de base de l'URI.
581
		if (!$this->getOption(self::OPTION_STRICTE) && $reference->schema == $this->schema) {
576
		if (!$this->getOption(self::OPTION_STRICTE) && $reference->schema == $this->schema) {
582
			$reference->schema = false;
577
			$reference->schema = false;
583
		}
578
		}
584
 
579
 
585
		$cible = new self('');
580
		$cible = new self('');
586
		if ($reference->schema !== false) {
581
		if ($reference->schema !== false) {
587
			$cible->schema = $reference->schema;
582
			$cible->schema = $reference->schema;
588
			$cible->setAutorite($reference->getAutorite());
583
			$cible->setAutorite($reference->getAutorite());
589
			$cible->chemin  = self::supprimerSegmentsAPoints($reference->chemin);
584
			$cible->chemin  = self::supprimerSegmentsAPoints($reference->chemin);
590
			$cible->requete = $reference->requete;
585
			$cible->requete = $reference->requete;
591
		} else {
586
		} else {
592
			$autorite = $reference->getAutorite();
587
			$autorite = $reference->getAutorite();
593
			if ($autorite !== false) {
588
			if ($autorite !== false) {
594
				$cible->setAutorite($autorite);
589
				$cible->setAutorite($autorite);
595
				$cible->chemin  = self::supprimerSegmentsAPoints($reference->chemin);
590
				$cible->chemin  = self::supprimerSegmentsAPoints($reference->chemin);
596
				$cible->requete = $reference->requete;
591
				$cible->requete = $reference->requete;
597
			} else {
592
			} else {
598
				if ($reference->chemin == '') {
593
				if ($reference->chemin == '') {
599
					$cible->chemin = $this->chemin;
594
					$cible->chemin = $this->chemin;
600
					if ($reference->requete !== false) {
595
					if ($reference->requete !== false) {
601
						$cible->requete = $reference->requete;
596
						$cible->requete = $reference->requete;
602
					} else {
597
					} else {
603
						$cible->requete = $this->requete;
598
						$cible->requete = $this->requete;
604
					}
599
					}
605
				} else {
600
				} else {
606
					if (substr($reference->chemin, 0, 1) == '/') {
601
					if (substr($reference->chemin, 0, 1) == '/') {
607
						$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin);
602
						$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin);
608
					} else {
603
					} else {
609
						// Concaténation chemins (RFC 3986, section 5.2.3)
604
						// Concaténation chemins (RFC 3986, section 5.2.3)
610
						if ($this->hote !== false && $this->chemin == '') {
605
						if ($this->hote !== false && $this->chemin == '') {
611
							$cible->chemin = '/' . $this->chemin;
606
							$cible->chemin = '/' . $this->chemin;
612
						} else {
607
						} else {
613
							$i = strrpos($this->chemin, '/');
608
							$i = strrpos($this->chemin, '/');
614
							if ($i !== false) {
609
							if ($i !== false) {
615
								$cible->chemin = substr($this->chemin, 0, $i + 1);
610
								$cible->chemin = substr($this->chemin, 0, $i + 1);
616
							}
611
							}
617
							$cible->chemin .= $reference->chemin;
612
							$cible->chemin .= $reference->chemin;
618
						}
613
						}
619
						$cible->chemin = self::supprimerSegmentsAPoints($cible->chemin);
614
						$cible->chemin = self::supprimerSegmentsAPoints($cible->chemin);
620
					}
615
					}
621
					$cible->requete = $reference->requete;
616
					$cible->requete = $reference->requete;
622
				}
617
				}
623
				$cible->setAutorite($this->getAutorite());
618
				$cible->setAutorite($this->getAutorite());
624
			}
619
			}
625
			$cible->schema = $this->schema;
620
			$cible->schema = $this->schema;
626
		}
621
		}
627
 
622
 
628
		$cible->fragment = $reference->fragment;
623
		$cible->fragment = $reference->fragment;
629
 
624
 
630
		return $cible;
625
		return $cible;
631
	}
626
	}
632
 
627
 
633
	/**
628
	/**
634
	 * La suppression des segments à points est décrite dans la RFC 3986, section 5.2.4, e.g.
629
	 * La suppression des segments à points est décrite dans la RFC 3986, section 5.2.4, e.g.
635
	 * "/foo/../bar/baz" => "/bar/baz"
630
	 * "/foo/../bar/baz" => "/bar/baz"
636
	 *
631
	 *
637
	 * @param string $chemin un chemin
632
	 * @param string $chemin un chemin
638
	 *
633
	 *
639
	 * @return string un chemin
634
	 * @return string un chemin
640
	 */
635
	 */
641
	private static function supprimerSegmentsAPoints($chemin) {
636
	private static function supprimerSegmentsAPoints($chemin) {
642
		$sortie = '';
637
		$sortie = '';
643
 
638
 
644
		// Assurons de ne pas nous retrouver piégés dans une boucle infinie due à un bug de
639
		// Assurons de ne pas nous retrouver piégés dans une boucle infinie due à un bug de
645
		// cette méthode
640
		// cette méthode
646
		$j = 0;
641
		$j = 0;
647
		while ($chemin && $j++ < 100) {
642
		while ($chemin && $j++ < 100) {
648
			// Étape A
643
			// Étape A
649
			if (substr($chemin, 0, 2) == './') {
644
			if (substr($chemin, 0, 2) == './') {
650
				$chemin = substr($chemin, 2);
645
				$chemin = substr($chemin, 2);
651
			} elseif (substr($chemin, 0, 3) == '../') {
646
			} elseif (substr($chemin, 0, 3) == '../') {
652
				$chemin = substr($chemin, 3);
647
				$chemin = substr($chemin, 3);
653
 
648
 
654
			// Étape B
649
			// Étape B
655
			} elseif (substr($chemin, 0, 3) == '/./' || $chemin == '/.') {
650
			} elseif (substr($chemin, 0, 3) == '/./' || $chemin == '/.') {
656
				$chemin = '/' . substr($chemin, 3);
651
				$chemin = '/' . substr($chemin, 3);
657
 
652
 
658
			// Étape C
653
			// Étape C
659
			} elseif (substr($chemin, 0, 4) == '/../' || $chemin == '/..') {
654
			} elseif (substr($chemin, 0, 4) == '/../' || $chemin == '/..') {
660
				$chemin = '/' . substr($chemin, 4);
655
				$chemin = '/' . substr($chemin, 4);
661
				$i = strrpos($sortie, '/');
656
				$i = strrpos($sortie, '/');
662
				$sortie = $i === false ? '' : substr($sortie, 0, $i);
657
				$sortie = $i === false ? '' : substr($sortie, 0, $i);
663
 
658
 
664
			// Étape D
659
			// Étape D
665
			} elseif ($chemin == '.' || $chemin == '..') {
660
			} elseif ($chemin == '.' || $chemin == '..') {
666
				$chemin = '';
661
				$chemin = '';
667
 
662
 
668
			// Étape E
663
			// Étape E
669
			} else {
664
			} else {
670
				$i = strpos($chemin, '/');
665
				$i = strpos($chemin, '/');
671
				if ($i === 0) {
666
				if ($i === 0) {
672
					$i = strpos($chemin, '/', 1);
667
					$i = strpos($chemin, '/', 1);
673
				}
668
				}
674
				if ($i === false) {
669
				if ($i === false) {
675
					$i = strlen($chemin);
670
					$i = strlen($chemin);
676
				}
671
				}
677
				$sortie .= substr($chemin, 0, $i);
672
				$sortie .= substr($chemin, 0, $i);
678
				$chemin = substr($chemin, $i);
673
				$chemin = substr($chemin, $i);
679
			}
674
			}
680
		}
675
		}
681
 
676
 
682
		return $sortie;
677
		return $sortie;
683
	}
678
	}
684
 
679
 
685
	/**
680
	/**
686
	 * Renvoie une instance de Url representant l'URL canonique du script PHP
681
	 * Renvoie une instance de Url representant l'URL canonique du script PHP
687
	 * en cours d'éxécution
682
	 * en cours d'éxécution
688
	 *
683
	 *
689
	 * @return  string
684
	 * @return  string
690
	 */
685
	 */
691
	public static function getCanonique() {
686
	public static function getCanonique() {
692
		if (!isset($_SERVER['REQUEST_METHOD'])) {
687
		if (!isset($_SERVER['REQUEST_METHOD'])) {
693
			// ALERT - pas d'URL en cours
688
			// ALERT - pas d'URL en cours
694
			throw new Exception('Le script n\'a pas été appellé à travers un serveur web');
689
			throw new Exception('Le script n\'a pas été appellé à travers un serveur web');
695
		}
690
		}
696
 
691
 
697
		// on part d'une URL relative
692
		// on part d'une URL relative
698
		$url = new self($_SERVER['PHP_SELF']);
693
		$url = new self($_SERVER['PHP_SELF']);
699
		$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http';
694
		$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http';
700
		$url->hote = $_SERVER['SERVER_NAME'];
695
		$url->hote = $_SERVER['SERVER_NAME'];
701
		$port = intval($_SERVER['SERVER_PORT']);
696
		$port = intval($_SERVER['SERVER_PORT']);
702
		if ($url->schema == 'http' && $port != 80 ||
697
		if ($url->schema == 'http' && $port != 80 ||
703
			$url->schema == 'https' && $port != 443) {
698
			$url->schema == 'https' && $port != 443) {
704
 
699
 
705
			$url->port = $port;
700
			$url->port = $port;
706
		}
701
		}
707
		return $url;
702
		return $url;
708
	}
703
	}
709
 
704
 
710
	/**
705
	/**
711
	 * Renvoie l'URL utilisée pour récupérer la requête en cours
706
	 * Renvoie l'URL utilisée pour récupérer la requête en cours
712
	 *
707
	 *
713
	 * @return  string
708
	 * @return  string
714
	 */
709
	 */
715
	public static function getURLDemande() {
710
	public static function getURLDemande() {
716
		return self::getDemande()->getUrl();
711
		return self::getDemande()->getUrl();
717
	}
712
	}
718
 
713
 
719
	/**
714
	/**
720
	 * Renvoie une instance de Url representant l'URL utilisée pour
715
	 * Renvoie une instance de Url representant l'URL utilisée pour
721
	 * récupérer la requête en cours
716
	 * récupérer la requête en cours
722
	 *
717
	 *
723
	 * @return  Url
718
	 * @return  Url
724
	 */
719
	 */
725
	public static function getDemande() {
720
	public static function getDemande() {
726
		if (!isset($_SERVER['REQUEST_METHOD'])) {
721
		if (!isset($_SERVER['REQUEST_METHOD'])) {
727
			// ALERTE - pas d'URL en cours
722
			// ALERTE - pas d'URL en cours
728
			throw new Exception('Le script n\'a pas été appellé à travers un serveur web');
723
			throw new Exception('Le script n\'a pas été appellé à travers un serveur web');
729
		}
724
		}
730
 
725
 
731
		// On part d'une URL relative
726
		// On part d'une URL relative
732
		$url = new self($_SERVER['REQUEST_URI']);
727
		$url = new self($_SERVER['REQUEST_URI']);
733
		$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http';
728
		$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http';
734
		// On met à jour les valeurs de l'hote et si possible du port
729
		// On met à jour les valeurs de l'hote et si possible du port
735
		$url->setAutorite($_SERVER['HTTP_hote']);
730
		$url->setAutorite($_SERVER['HTTP_hote']);
736
		return $url;
731
		return $url;
737
	}
732
	}
738
 
733
 
739
	/**
734
	/**
740
	 * Met à jour la valeur de l'option spécifiée.
735
	 * Met à jour la valeur de l'option spécifiée.
741
	 *
736
	 *
742
	 * @param string $nomOption une des constantes commençant par self::OPTION_
737
	 * @param string $nomOption une des constantes commençant par self::OPTION_
743
	 * @param mixed  $valeur	  valeur de l'option
738
	 * @param mixed  $valeur	  valeur de l'option
744
	 *
739
	 *
745
	 * @return void
740
	 * @return void
746
	 * @see  self::OPTION_STRICTE
741
	 * @see  self::OPTION_STRICTE
747
	 * @see  self::OPTION_UTILISER_CROCHETS
742
	 * @see  self::OPTION_UTILISER_CROCHETS
748
	 * @see  self::OPTION_ENCODER_CLES
743
	 * @see  self::OPTION_ENCODER_CLES
749
	 */
744
	 */
750
	function setOption($nomOption, $valeur) {
745
	function setOption($nomOption, $valeur) {
751
		if (!array_key_exists($nomOption, $this->options)) {
746
		if (!array_key_exists($nomOption, $this->options)) {
752
			return false;
747
			return false;
753
		}
748
		}
754
		$this->options[$nomOption] = $valeur;
749
		$this->options[$nomOption] = $valeur;
755
	}
750
	}
756
 
751
 
757
	/**
752
	/**
758
	 * Renvoie la valeur de l'option specifiée.
753
	 * Renvoie la valeur de l'option specifiée.
759
	 *
754
	 *
760
	 * @param string $nomOption Nom de l'option demandée
755
	 * @param string $nomOption Nom de l'option demandée
761
	 *
756
	 *
762
	 * @return  mixed
757
	 * @return  mixed
763
	 */
758
	 */
764
	function getOption($nomOption) {
759
	function getOption($nomOption) {
765
		return isset($this->options[$nomOption])
760
		return isset($this->options[$nomOption])
766
			? $this->options[$nomOption] : false;
761
			? $this->options[$nomOption] : false;
767
	}
762
	}
768
 
763
 
769
	public function __toString() {
764
	public function __toString() {
770
		return $this->getURL();
765
		return $this->getURL();
771
	}
766
	}
772
}
767
}
773
 
768