Problème avec preg_match

Psylozoff
Invité n'ayant pas de compte PHPfrance

07 sept. 2012, 21:57

Bonjour,
je rencontre actuellement un problème avec une expression régulière.

Je dois analyser un chemin pour savoir s'il est valide.
S'il est valide, je dois analyser ses différentes parties.
Je tente donc de profiter des avantages de preg_match en récupérant les parties du chemin pendant l'analyse.

Voici mon code :
$regexFileOrDirectoryPath = '/^\/(([a-z\d]+([-_][a-z\d]+)*)\/)*([a-z\d]+([-_][a-z\d]+)*\.[a-z\d]+)?$/i';
$request = '/machin-truc/test/regexp/voyons-voir/';
        
        if (preg_match($regexFileOrDirectoryPath, $request, $matchesRegexFileOrDirectoryPath) !== 0) {

            print_r($matchesRegexFileOrDirectoryPath);
            exit();
}
J'obtiens ça :

Array ( [0] => /machin-truc/test/regexp/voyons-voir/ [1] => voyons-voir/ [2] => voyons-voir [3] => -voir )

Donc finalement, ça à l'air de marcher, seulement, au lieu d'avoir des tableaux dans un tableau, j'ai l'impression que preg_match écrase les matchs pour ne laisser qu'une seule valeur.

Avec preg_match_all j'obtiens ça :

Array ( [0] => Array ( [0] => /machin-truc/test/regexp/voyons-voir/ ) [1] => Array ( [0] => voyons-voir/ ) [2] => Array ( [0] => voyons-voir ) [3] => Array ( [0] => -voir ) [4] => Array ( [0] => ) [5] => Array ( [0] => ) )

Des tableaux dans un tableau mais toujours uniquement le dernier élément matché pour chaque couple de parenthèses...
J'imagine qu'il y a une légère erreur dans ma regexp, seulement je n'arrive pas à la voir..!

print_r à l'air de planter aussi, il me semble que d'habitude l'affichage est mieux formaté...

Si vous avez une solution ou un avis n'hésitez surtout pas :p
Merci d'avance!

Mammouth du PHP | 2278 Messages

08 sept. 2012, 09:40

Je ne saisis pas bien ton souci car:
<?PHP
$masque = "/^\/(([a-z\d]+([-_][a-z\d]+)*)\/)*([a-z\d]+([-_][a-z\d]+)*\.[a-z\d]+)?$/i";
//chemins faux à cause de l'espace rendent faux ou 0 et un tableau vide.
$chemin = "/machin-truc/test /regexp/voyons-voir/";
$chemin = "/machin-tr uc/test/regexp/voyons-voir/";
$z =preg_match($masque, $chemin, $matchesRegexFileOrDirectoryPath);

print_r($matchesRegexFileOrDirectoryPath);
?>
Le problème que je verrais, c'est qu'avec cette fonction on ne sait pas quelle partie du chemin ne convient pas.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD