"2007/06/03/ta_mere_en_short" et preg_match

Eléphant du PHP | 121 Messages

03 déc. 2007, 06:07

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 !
Modifié en dernier par Gofromiel le 03 déc. 2007, 08:28, modifié 1 fois.

Eléphant du PHP | 445 Messages

03 déc. 2007, 08:12

Pourquoi es tu obliger d'utiliser un preg_match() ?

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

Eléphant du PHP | 121 Messages

03 déc. 2007, 08:20

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()...

ViPHP
ViPHP | 1380 Messages

03 déc. 2007, 08:24

Ceci devrait faire l'affaire:
$pat = '#(\d{4})/?(\d{2})?/?(\d{2})?/?([\w]+)?#';
ripat

Eléphant du PHP | 121 Messages

03 déc. 2007, 08:27

Ma voui !!!! C'est merveilleux !

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

ViPHP
ViPHP | 1380 Messages

03 déc. 2007, 08:34

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:
ripat