Page 1 sur 1

"2007/06/03/ta_mere_en_short" et preg_match

Posté : 03 déc. 2007, 06:07
par Gofromiel
Ralala, je ne comprends franchement rien aux expressions régulière, dès qu'il s'agit de recherche un peu compliqué je suis complètement perdu :-(

J'aimerai récupérer les membres de l'expression "2007/06/03/ta_mere_en_short" où chaque membre peut être optionnel. J'ai *absolument* besoin d'utiliser preg_match() parce que j'utilise des expressions régulières pour reconnaitre les adresses et servir les bons documents, en récupérant les arguments au passage... Bref, voici mon piètre bout de code :
$strings = array
(
	'2007',
	'2007/06',
	'2007/06/03',
	'2007/06/03/ta_mere_en_short'
);

$pat = '#(\d{4})/(\d{2})/(\d{2})/([\w]+)|(\d{4})/(\d{2})/(\d{2})|(\d{4})/(\d{2})|(\d{4})#';

foreach ($strings as $str)
{
	$rc = preg_match($pat, $str, $m);
	
	echo "<pre>result: $rc, " . print_r($m, true) . '</pre>';
}
Avec tout ce bordel j'ai le résultat suivant :

Code : Tout sélectionner

result: 1, Array ( [0] => 2007 [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => [10] => 2007 ) result: 1, Array ( [0] => 2007/06 [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => 2007 [9] => 06 ) result: 1, Array ( [0] => 2007/06/03 [1] => [2] => [3] => [4] => [5] => 2007 [6] => 06 [7] => 03 ) result: 1, Array ( [0] => 2007/06/03/ta_mere_en_short [1] => 2007 [2] => 06 [3] => 03 [4] => ta_mere_en_short )
Pas trop ce que j'espère :-(

L'idéal serait d'obtenir un tableau comme le dernier où les arguments optionnels seraient simplement oubliés, mais comme vous pouvez le voir avec le premier tableau, tous les masques sont ajoutés... je ne sais pas quoi faire. Je n'ai rien compris au conditionnel, alors j'implore votre aide éclairée et sympathique.

Merci !!

PS: Sinon, je vais être obligé de me suicider aux petits suisses périmés... yeurk !

Posté : 03 déc. 2007, 08:12
par h0_noMan
Pourquoi es tu obliger d'utiliser un preg_match() ?

Un explode("/",$maChaine); te retourne un tableau.

Posté : 03 déc. 2007, 08:20
par Gofromiel
Hmm, comme je l'ai dis plus haut, je suis obligé d'utiliser preg_match(). Je m'en sers pour reconnaitre des adresses de documents avec des options, c'est un peu plus compliqué qu'un explode()...

Posté : 03 déc. 2007, 08:24
par Ripat
Ceci devrait faire l'affaire:
$pat = '#(\d{4})/?(\d{2})?/?(\d{2})?/?([\w]+)?#';

Posté : 03 déc. 2007, 08:27
par Gofromiel
Ma voui !!!! C'est merveilleux !

Merci Ripat, Ô dieu de l'expression régulière !! :-D

Posté : 03 déc. 2007, 08:34
par Ripat
Heu, ceci dit, je n'ai pas très bien compris pourquoi ton expression retournait des lignes d'array vides.

Ton motif était "logiquement" correct. Faudrait que je pose la question à mon pote Jeffrey Friedl mais il est fort occupé ces derniers temps! :wink: