[expression régulière] Capturer du texte jusqu'à une occurrence

Capturer du texte jusqu'à une occurrence [expression régulière] - PHP - Programmation

Marsh Posté le 14-11-2002 à 16:35:02    

Bonjour à tous.
J'ai encore un problème avec une expression régulière.  
 
Par exemple, si je veux mettre en gras le texte en italique :
 

Code :
  1. $text = "<i>Premiere phrase.</i> Seconde phrase. <i>Troisième phrase.</i>";
  2. echo preg_replace("`(<i>.*</i> )`si", "<b>\\1</b>", $text)."<br>\n";
  3. // Affiche "<b><i>Premiere phrase.</i> Seconde phrase. <i>Troisième phrase.</i></b><br>"
  4. // Voici l'astuce que j'utilise actuelement.
  5. echo preg_replace("`(<i>[^<]*</i> )`si", "<b>\\1</b>", $text)."<br>\n";
  6. // Affiche "<b><i>Premiere phrase.</i></b> Seconde phrase. <b><i>Troisième phrase.</i></b><br>"
  7. // Ca marche, mais il suffit que mon texte change pour que ça foire.
  8. $text = "<i>Premiere <u>phrase</u>.</i> Seconde phrase. <i>Troisième phrase.</i>";
  9. echo preg_replace("`(<i>[^<]*</i> )`si", "<b>\\1</b>", $text)."<br>\n";
  10. // Affiche "<i>Premiere <u>phrase</u>.</i> Seconde phrase. <b><i>Troisième phrase.</i></b><br>"


 
Avec « ([^<]*) » je capture n'importe quel caractère qui n'est pas « < », un nombre de fois indéfini.
Or, je veux capturer n'importe quel caractère un nombre de fois indéfini, tant qu'on ne rencontre pas « </i> ».
 
C'est faisable ? Si oui, comment ?
Merci d'avance.

Reply

Marsh Posté le 14-11-2002 à 16:35:02   

Reply

Marsh Posté le 14-11-2002 à 16:39:13    

<i>(.*)</i>  :??:
je relis ... ou je comprends rien, ou  :D


Message édité par beleg le 14-11-2002 à 16:43:05
Reply

Marsh Posté le 14-11-2002 à 16:44:14    

Non, ca ne prend en compte que le premier « <i> » et le dernier « </i> ».

Code :
  1. $text = "<i>Premiere phrase.</i> Seconde phrase. <i>Troisième phrase.</i>";
  2. echo preg_replace("`(<i>.*</i> )`si", "<b>\\1</b>", $text)."<br>\n";


Affiche "<b><i>Premiere phrase.</i> Seconde phrase. <i>Troisième phrase.</i></b><br>".

Reply

Marsh Posté le 14-11-2002 à 18:15:35    

jai  :bounce:  
 

Code :
  1. $text = str_replace("<i>", "<b>", $text);
  2. $text = str_replace("</i>", "</b>", $text);


Reply

Marsh Posté le 14-11-2002 à 19:48:36    

Merci, mais ma requête est plus complexe que l'exemple que j'ai donné. En fait, je dois capturer ce qui se trouve entre « <i> » et « </i> », pour retraiter cette capture.
À trop vouloir simplifier mon problème... je l'ai trop simplifié. :/

Reply

Marsh Posté le 14-11-2002 à 19:52:35    

En fait ce qu'il me faut, c'est un « [^<]* » qui fonctionne pour une chaîne de caractère.
 
Édit : quelqu'un connaît-il ce livre :
http://www.oreilly.fr/catalogue/regex.html
Les livres O'Reilly ne m'ont jamais déçu, mais celui-là est t'il vraiment utile ?


Message édité par kalex le 14-11-2002 à 19:59:03
Reply

Marsh Posté le 14-11-2002 à 20:06:35    

pfff ca va commencer a etre dur ... jai bien une idée mais ca vire a l'usine a gaz ... a partir du moment ou tu commences a imbriquer des balises :/
 
je me casse mais je mets un debut  
 
transformer les <i> en par exemple (idem pr le </i> en )
faire le ereg avec \[i\]([^\[)*\[/i\] => [b]\\1[/n]
transformer les [b] en <b>  
 
je relirais ca + tard au calme ... et precise un peu ce que tu veux faire.

Reply

Marsh Posté le 14-11-2002 à 22:23:05    

Code :
  1. $text = "<i>Premiere phrase.</i> Seconde phrase. <i>Troisième phrase.</i>";
  2. echo preg_replace("`(<i>(.*?)</i>`", "<b>\\1</b>", $text)."<br>\n";


Ca devrait marché, il faut mettre un ? pour qu'il essaie de matcher la chaine la plus petite qui correspond ;)


---------------
Belgian connection
Reply

Marsh Posté le 14-11-2002 à 22:33:57    

:jap:  
 
By default, a quantified subpattern is "greedy", that is, it will match as many times as possible (given a particular starting location) while still allowing the rest of the pattern to match. If you want it to match the minimum number of times possible, follow the quantifier with a "?". Note that the meanings don't change, just the "greediness":
 
    *?    Match 0 or more times
    +?    Match 1 or more times
    ??    Match 0 or 1 time
    {n}?   Match exactly n times
    {n,}?  Match at least n times
    {n,m}? Match at least n but not more than m times  
 
javais jamais eu a lire jusque la.  
http://www.perldoc.com/perl5.6/pod [...] xpressions

Reply

Marsh Posté le 15-11-2002 à 01:04:58    

Grand merci, belgique ! Tu me rends un grand service. :jap:
 
Et merci à toi aussi beleg, pour t'être intéressé à mes problèmes. ;)

Reply

Marsh Posté le 15-11-2002 à 01:04:58   

Reply

Marsh Posté le 15-11-2002 à 12:59:27    

c'est pas tous les jours que je peux aider ;)


---------------
Belgian connection
Reply

Sujets relatifs:

Leave a Replay

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