Regexp qui devrait matcher plus d'une seule fois

Regexp qui devrait matcher plus d'une seule fois - Perl - Programmation

Marsh Posté le 20-02-2008 à 15:28:42    

Bonjour,
 
Juste pour savoir pourquoi ma regexp ne matche qu'une seule fois, alors qu'elle devrait matcher 2 fois ??
 
la chaîne :  

[quote author=Skurpit link=topic=1789.msg130897#msg130897 date=1203505782]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/2tw5.jpg[/img][/URL]
[/quote]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/2tw5.jpg[/img][/URL][quote author=Skurpit link=topic=1789.msg130897#msg130897 date=1203505782]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/2tw5.jpg[/img][/URL]
[/quote]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/2tw5.jpg[/img][/URL]


 
la regexp :

Code :
  1. if ( m/\[quote\s+(.*?)\](.*?)\[\/quote\]/isg ) {
  2. print "match\n";
  3. print $2."\n";
  4. $_ = $2;
  5. $_ =~ s/\[url=(.*?)\]\[img(.*?)\](.*?)\[\/img\]\[\/url\]/$3/ig;
  6. print $_."\n";
  7. }


 
 
merci :)


---------------
:: Light is Right ::
Reply

Marsh Posté le 20-02-2008 à 15:28:42   

Reply

Marsh Posté le 20-02-2008 à 16:49:29    

Tout simplement parce que ton if() ne traite que la première occurrence trouvée.
 
Fais plutôt :

Code :
  1. while ( m/\[quote\s+(.*?)\](.*?)\[\/quote\]/isg ) {
  2. print "match\n";
  3. print $2."\n";
  4. $_ = $2;
  5. $_ =~ s/\[url=(.*?)\]\[img(.*?)\](.*?)\[\/img\]\[\/url\]/$3/ig;
  6. print $_."\n";
  7. }


Reply

Marsh Posté le 20-02-2008 à 17:01:52    

han ok merci ;)
 
ça avance tant que ça matche en gros si je comprends bien :)


---------------
:: Light is Right ::
Reply

Marsh Posté le 20-02-2008 à 17:11:15    

Autant y aller franchement dans la regex incompréhensible non?

Code :
  1. $tachaine =~ s/(\[quote\s+(.*?)\])\s*(\[url=(.*?)\]\[img(.*?)\](.*?)\[\/img\]\[\/url\])\s*(\[\/quote\])/$1$6$7\n/isg;

Message cité 1 fois
Message édité par anapajari le 20-02-2008 à 17:13:56

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 20-02-2008 à 17:12:23    

hum il matche un peu trop je crois là :D
 

Code :
  1. while ( m/\[quote\s+(.*?)\](.*?)\[\/quote\]/isg ) {
  2. $_ =~ s/\[url=(.*?)\]\[img(.*?)\](.*?)\[\/img\]\[\/url\]/$3/isg;
  3. print "\n\nmatch\n\n";
  4. print $_."\n";


 
et ça sort tout ça :
 

match
 
[quote author=Skurpit link=topic=1789.msg130897#msg130897 date=1203505782]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
[/quote]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg[quote author=TOTO link=topic=1789.msg130897#msg130897 date=1203505782]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
[/quote]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
 
 
match
 
[quote author=Skurpit link=topic=1789.msg130897#msg130897 date=1203505782]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
[/quote]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg[quote author=TOTO link=topic=1789.msg130897#msg130897 date=1203505782]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
[/quote]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
 
 
match
 
[quote author=Skurpit link=topic=1789.msg130897#msg130897 date=1203505782]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
[/quote]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg[quote author=TOTO link=topic=1789.msg130897#msg130897 date=1203505782]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg
[/quote]
http://img405.imageshack.us/img405/7328/sanstitre2tw5.jpg


---------------
:: Light is Right ::
Reply

Marsh Posté le 20-02-2008 à 17:38:57    

anapajari a écrit :

Autant y aller franchement dans la regex incompréhensible non?

Code :
  1. $tachaine =~ s/(\[quote\s+(.*?)\])\s*(\[url=(.*?)\]\[img(.*?)\](.*?)\[\/img\]\[\/url\])\s*(\[\/quote\])/$1$6$7\n/isg;



merci ça marche nikel [:jar jar]
 
il y a plus simple tu crois ? :D


---------------
:: Light is Right ::
Reply

Marsh Posté le 20-02-2008 à 18:03:20    

bon en fait ça ne marche que dans ce cas particulier :/
 
je cherche tout simplement à supprimer les balises IMG ou URL/IMG imbriquées, mais uniquement dans les quotes
 
vous aurez compris que c'est pour faire comme sur le forum hardware, éviter d'avoir les images dans les quotes :)


---------------
:: Light is Right ::
Reply

Marsh Posté le 20-02-2008 à 18:26:12    

le premier \s+ devrait être un \s*
De la même façon, il doit en manquer entre url et img et pareil sur les balises fermantes.
Montre un exemple "qui marche pas" stp.


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 20-02-2008 à 20:26:01    

Bonjour,
 
Pour la correction avec le while  

Citation :

Code :
  1. while ( m/\[quote\s+(.*?)\](.*?)\[\/quote\]/isg ) {
  2.    $_ =~ s/\[url=(.*?)\]\[img(.*?)\](.*?)\[\/img\]\[\/url\]/$3/isg;
  3.    print "\n\nmatch\n\n";
  4.    print $_."\n";
  5. }



 
L'erreur vient du $_, il vaut utiliser $1.
 
Sinon, quelques principes que j'applique :  

  • il vaut mieux éviter les .*? pour moi, même si ça marche, surtout si on cherche "tout ce qui est différent de ']'", car il existe une syntaxe toute faite pour ça : [^...]. Bon il est vrai qu'ici, ce n'est pas très pratique car le caractère ] est un caractère spécial...
  • Ensuite en regexp, il vaut mieux aussi éviter les parenthèses inutiles elles ne doivent servir qu'à extraire les données, et si l'on doit définir une sous-chaine, il vaut mieux utiliser (?:...)


donc pour moi, la première regexp devrait s'écrire

Code :
  1. while (m/\[quote[^\]]*\](.*?)\[\/quote\]/isg){
  2.     ...
  3. }


et donc tout est contenu dans $1...
 
Ensuite la 2ème regexp ne match que les [url...][img]...[/img][/url]. Donc si tu souhaite aussi récupérer les [img][/img] seules ça ne marchera pas...
 
Donc, tu pourrais faire qqch du style  

Code :
  1. $tmp=$1;
  2. $tmp =~ s/(?:\[img[^\]]*\]\s*)?\[url[^\]*\](.*?)\[\/img\](?:\s*\[\/url\])?/$1/isg;


 
Le seul truc que j'ai pas compris : tu veux virer le quote complet ou juste les liens/images dans les quotes?


Message édité par dreameddeath le 20-02-2008 à 21:35:24
Reply

Marsh Posté le 21-02-2008 à 09:49:07    

anapajari a écrit :

le premier \s+ devrait être un \s*
De la même façon, il doit en manquer entre url et img et pareil sur les balises fermantes.
Montre un exemple "qui marche pas" stp.


par exemple 2 liens/images dans un même quote, ça merdouille

 


dreameddeath : je veux virer les images qui se trouvent dans des quotes
comme sur le forum en fait ;)
mais il y a les cas avec balise img simple et balises url et img imbriquées


Message édité par Tomate le 21-02-2008 à 09:52:27

---------------
:: Light is Right ::
Reply

Marsh Posté le 21-02-2008 à 09:49:07   

Reply

Marsh Posté le 22-02-2008 à 22:49:42    

Tu peux essayer qqch du style :

Code :
  1. my @replace_str=();
  2. while(s/\[quote[^\]]*\](.*?)\[\/quote\]/%%%%/isg){
  3.     my $tmp = $1;
  4.     $tmp =~ s/(?:\[img[^\]]*\]\s*)?\[url[^\]*\](.*?)\[\/img\](?:\s*\[\/url\])?/$1/isg;
  5.     push(@replace_str,$tmp); 
  6. }
  7. s/%%%%/shift(@replace_str)/eg;


 

Reply

Marsh Posté le 26-02-2008 à 11:39:56    

avec le texte suivant :

[quote author=Skurpit link=topic=1789.msg130897#msg130897 date=1203505782]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre1.jpg[/img][/URL]
[/quote]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre2.jpg[/img][/URL][quote author=TOTO link=topic=1789.msg130897#msg130897 date=1203505782]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre3.jpg[/img][/URL]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre4.jpg[/img][/URL]
[/quote]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre5.jpg[/img][/URL]


 
$_ contient ça :

[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre3.jpg[/img][/URL]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre4.jpg[/img][/URL]
 
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre2.jpg[/img][/URL]
[URL=http://imageshack.us][IMG]http://img405.imageshack.us/img405/7328/sanstitre5.jpg[/img][/URL]


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2008 à 01:06:22    

Bon j'ai corrigé pas mal de choses et voici un truc qui marche pas mal  

Code :
  1. s/(\[quote[^\]]*\])(.*?)(\[\/quote\])/
  2.     my $quote_start = $1;
  3.     my $quote_intern_to_modify = $2;
  4.     my $quote_end = $3;
  5.     $quote_intern_to_modify =~ s!(?:\[url[^\]]*\]\s*)?\[img[^\]]*\](.*?)\[\/img\](?:\s*\[\/url\])?!$1!isg;
  6.     $quote_start.$quote_intern_to_modify.$quote_end;
  7.   /iseg;


 
ça remplace les [url][img]tutu[/img][/url] par tutu  
 
voilà voilà

Reply

Marsh Posté le 28-02-2008 à 10:51:40    

un grand merci ça à l'air de fonctionner nikel ! :)


---------------
:: Light is Right ::
Reply

Sujets relatifs:

Leave a Replay

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