Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/10/2007, 18h18   #1
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 33
Points : 14
Points : 14
Par défaut Regex du tuto de Julien Pauli (MVC controleur)

Bonjour a tous,

Je suis en train de suivre le tutoriel de Julien Pauli :
http://julien-pauli.developpez.com/t...vc-controleur/

J'ai beaucoup de mal a comprendre l'expression reguliere suivante (qui se trouve dans la classe Request du paragraphe III.Le frontController ou contrôleur frontal ) :
Code :
1
2
 
preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
Il s'agit de parser l'URL pour déterminer un module, une action, et des paramètres.
C'est la premiere fois que je vois l'utilisation de P ou de textes encadres de <> dans une regex, je ne comprends pas ce qu'ils signifient.

J'ai fait quelques tests avec les exemples d'URL que donne l'auteur (pour essayer de mieux comprendre) :
Code :
1
2
3
 
http://monsite.com/index.php?module=bibliotheque&action=show_livres&categorie=x 
http://monsite.com/index.php/bibliotheque/show_livres?categorie=x
mais cela ne fonctionne malheureusement pas.

Si vous comprenez cette expression reguliere, pourriez vous m'expliquer comment elle fonctionne, svp ?
Merci de votre aide.

ps) desole pour l'absence des accents, j'utilise un clavier qwerty.
ipso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2007, 18h26   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par ipso Voir le message
J'ai fait quelques tests avec les exemples d'URL que donne l'auteur (pour essayer de mieux comprendre) :
Code :
1
2
3
 
http://monsite.com/index.php?module=bibliotheque&action=show_livres&categorie=x 
http://monsite.com/index.php/bibliotheque/show_livres?categorie=x
mais cela ne fonctionne malheureusement pas.
Vous ne risquez pas d'obtenir une correspondance avec ces chaînes C'est la partie chemin qui est testée et non l'URL complète : remarquez notamment que la chaîne attendue doit commencer par un slash.

Citation:
Envoyé par ipso Voir le message
Il s'agit de parser l'URL pour déterminer un module, une action, et des paramètres.
C'est la premiere fois que je vois l'utilisation de P ou de textes encadres de <> dans une regex, je ne comprends pas ce qu'ils signifient.
C'est pour nommer le motif (la capture) : appliquez print_r ou var_dump sur $matches, vous verrez bien le résultat avec et sans. (d'ailleurs on le voit bien dans la manière dont est utilisé ce résultat dans la classe frontController, méthode dispatch).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 10h32   #3
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 33
Points : 14
Points : 14
Bonjour,

merci pour votre reponse.

Citation:
Vous ne risquez pas d'obtenir une correspondance avec ces chaînes C'est la partie chemin qui est testée et non l'URL complète : remarquez notamment que la chaîne attendue doit commencer par un slash.
Oui, en fait je teste avec la fonction entiere. Voici mon script de tests :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
function route() {
 
	echo "<br>REQUEST_URI = ".$_SERVER["REQUEST_URI"];
 
	$requestUri = substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"], "/".basename(__FILE__)) + strlen("/".basename(__FILE__)));
 
	echo "<br>requestUri = ".$requestUri;
	if (empty($requestUri)) {
		return array();
	}
 
	$path = parse_url($requestUri, PHP_URL_PATH);
	echo "<br>path = ".$path;
 
	preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
 
	$args = explode("&", parse_url($requestUri, PHP_URL_QUERY));
	echo "<br>args = ";
	print_r($args);
 
	echo "<br>matches = ";
	print_r($matches);
 
	return $matches;
}
 
$mavar = route();
echo "<br>mavar = ";
print_r($mavar);
TEST 1 avec la chaine /index.php?module=bibliotheque&action=show_livres&categorie=x, resultats :
Code :
1
2
3
4
5
6
7
 
REQUEST_URI = /index.php?module=bibliotheque&action=show_livres&categorie=x
requestUri = bliotheque&action=show_livres&categorie=x
path = bliotheque&action=show_livres&categorie=x
args = Array ( [0] => )
matches = Array ( )
mavar = Array ( )
TEST 2 avec la chaine /index.php/bibliotheque/show_livres?categorie=x, resultats :
Code :
1
2
3
4
5
6
7
 
REQUEST_URI = /index.php/bibliotheque/show_livres?categorie=x
requestUri = que/show_livres?categorie=x
path = que/show_livres
args = Array ( [0] => categorie=x )
matches = Array ( )
mavar = Array ( )
je ne pense pas que les sorties soient valables dans mon cas...
Pourriez-vous me donner un exemple de chaine pour lequel cela fonctionne svp ?
Merci pour votre aide.
ipso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 11h07   #4
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 33
Points : 14
Points : 14
hop hop hop !!
Argh, je me suis completement plante, je recommence :

Voici ma fonction test :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
function route() {
 
	echo "<br>REQUEST_URI = ".$_SERVER["REQUEST_URI"];
	echo "<br>basename = ".basename(__FILE__);
 
	$requestUri = substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"], "/".basename(__FILE__)) + strlen("/".basename(__FILE__)));
 
	echo "<br>requestUri = ".$requestUri;
	if (empty($requestUri)) {
		return array();
	}
 
	$path = parse_url($requestUri, PHP_URL_PATH);
	echo "<br>path = ".$path;
 
	preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
 
	$args = explode("&", parse_url($requestUri, PHP_URL_QUERY));
	echo "<br>args = ";
	print_r($args);
 
	echo "<br>matches = ";
	print_r($matches);
 
	return $matches;
}
 
$mavar = route();
echo "<br>mavar = ";
print_r($mavar);
Voici ma chaine de test :
(mon erreur dans le post precedent est d'avoir donne arbitrairement une var $_SERVER["REQUEST_URI"] alors que le script decortique l'url du script en lui meme, vous suivez ? Donc pour moi, le chemin complet de mon script de test est le suivant)
Code :
1
2
 
http://localhost/dev/TESTS/FrontController_pauli/test_preg_match.php/bibliotheque/show_livres?categorie=x
Voici les resultats :
Code :
1
2
3
4
5
6
7
8
 
REQUEST_URI = /dev/TESTS/FrontController_pauli/test_preg_match.php/bibliotheque/show_livres?categorie=x
basename = test_preg_match.php
requestUri = /bibliotheque/show_livres?categorie=x
path = /bibliotheque/show_livres
args = Array ( [0] => categorie=x )
matches = Array ( [0] => /bibliotheque/show_livres [1] => /bibliotheque [module] => bibliotheque [2] => bibliotheque [3] => /show_livres [action] => show_livres [4] => show_livres )
mavar = Array ( [0] => /bibliotheque/show_livres [1] => /bibliotheque [module] => bibliotheque [2] => bibliotheque [3] => /show_livres [action] => show_livres [4] => show_livres )
Bon ca commence a ressembler a quelquechose, j'y vois plus clair.
Je continue mon travail de comprehension...
ipso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 11h25   #5
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 33
Points : 14
Points : 14
Maintenant je vous montre l'interet d'utiliser des motifs dans la regex (suite a la pertinente remarque de julp).

TEST 1 : la regex est de la forme suivante
Code :
1
2
 
preg_match("#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#", $path, $matches);
Le resultat est :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
matches = Array
(
    [0] => /bibliotheque/show_livres
    [1] => /bibliotheque
    [module] => bibliotheque
    [2] => bibliotheque
    [3] => /show_livres
    [action] => show_livres
    [4] => show_livres
)
TEST 2 : la regex est de la forme
(j'ai enleve ?P<module> et ?P<action>)
Code :
1
2
 
preg_match("#^(/(\w+))(/(\w+)/?)?$#", $path, $matches);
le resultat est alors :
Code :
1
2
3
4
5
6
7
8
9
 
matches = Array
(
    [0] => /bibliotheque/show_livres
    [1] => /bibliotheque
    [2] => bibliotheque
    [3] => /show_livres
    [4] => show_livres
)
Je comprends maintenant l'interet de ?P<module> et ?P<action>, ils permettent de manipuler directement le tableau de valeurs avec les clefs module et action...
Merci Julien (trop bon ce tuto !!) et Julp.
ipso est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h43.


 
 
 
 
Partenaires

Hébergement Web