Subversion Repositories Applications.framework

Rev

Rev 120 | Rev 148 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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