probleme de regexp

probleme de regexp - PHP - Programmation

Marsh Posté le 21-01-2008 à 12:57:34    

Bonjour,
 
j'ai un petit soucis.
 
J'ai fait le pattern suivant pour parser une adresse dailymotion :

Code :
  1. http://(?:www.|)dailymotion.com/(?:.*?)video/([a-z0-9]{1,8})(?:.*?)


 
Ainsi je devrait récupérer dans $1 la partie ([a-z0-9]{1,8}) lors d'un replace.
 
Or quand je test sur une adresse uelconque comme :

Code :
  1. http://www.dailymotion.com/fr/cluster/auto/featured/video/x4056d_wald-w216-give-some-serious-attitud_auto


 
$1 contien non pas x4056d come voulu, mais x4056d_wald-w216-give-some-serious-attitud_auto.
 
Je tourne en rond depuis une bonne heure dessus, si quelqu'un sait comment regler ce probleme je lui en serait reconnaissant :)
 
Quand on a un probleme qui demande a etre resolu par des regexp alors on en a 2. Je sais plus qui a dit ca mais je commence a le croire :)
 
Merci d'avance !
 


Message édité par patastronch le 21-01-2008 à 13:00:42
Reply

Marsh Posté le 21-01-2008 à 12:57:34   

Reply

Marsh Posté le 21-01-2008 à 13:25:39    

Ta regex est correcte et remonte ce qu'il faut, fais voir le code php que tu utilises pour récupérer ton truc.

Reply

Marsh Posté le 21-01-2008 à 13:29:34    

Voila le code exact écrémé des choses innutiles.
 

Code :
  1. $str="http://www.dailymotion.com/fr/cluster/auto/featured/video/x4056d_wald-w216-give-some-serious-attitud_auto";
  2. $pattern='#http://(?:www\.|)dailymotion\.com/(?:.*?)video/([a-z0-9]{1,8})(?:.*?)#';
  3. if(preg_match($pattern, $str)>0) echo preg_replace($pattern,'$1', $str);


 
Ca m'affiche : x4056d_wald-w216-give-some-serious-attitud_auto


Message édité par patastronch le 21-01-2008 à 13:30:13
Reply

Marsh Posté le 21-01-2008 à 14:10:44    

oui bon en fait tu as juste une petite erreur sur ta regex. C'est le dernier morceau qui va pas:  

([a-z0-9]{1,8})(?:.*?)


Comme tu l'as mis en non-greedy ( le ? ) est bien il s'arrête juste après ton motif $1.
Deux solutions:
- enlever le greedy

([a-z0-9]{1,8})(?:.*)


- le forcer à aller jusqu'à la fin de la ligne:

([a-z0-9]{1,8})(?:.*?)$


 
Maintenant la vrai question c'est pourquoi n'utilises tu pas le resultat du preg_match plutôt???
un truc dans le genre:

Code :
  1. preg_match($pattern, $str, $matches);
  2. print $matches[1];:

Reply

Marsh Posté le 21-01-2008 à 14:22:31    

Un grand merci pour ta réponse. Tes deux méthodes foncitonnent parfaitement et je comprends meme pouruqoi ca marchait pas maintenant.  
 
Quant au pourquoi j'utilise pas le resultat renvoyé par preg_match , y en a aucune. En fait je débute dans l 'utilisation des regexp et je fais les choses comme je les comprends pour l'instant. Je vais regarder plus en detail ce que peut apporter l'utilisation direct du du resultat renvoyé par preg_match.


Message édité par patastronch le 21-01-2008 à 14:22:57
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed