Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1139 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°245275
kalex
Posté le 14-11-2002 à 16:35:02  profilanswer
 

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.

mood
Publicité
Posté le 14-11-2002 à 16:35:02  profilanswer
 

n°245279
beleg
黑社會
Posté le 14-11-2002 à 16:39:13  profilanswer
 

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


Message édité par beleg le 14-11-2002 à 16:43:05
n°245283
kalex
Posté le 14-11-2002 à 16:44:14  profilanswer
 

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>".

n°245373
beleg
黑社會
Posté le 14-11-2002 à 18:15:35  profilanswer
 

jai  :bounce:  
 

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


n°245534
kalex
Posté le 14-11-2002 à 19:48:36  profilanswer
 

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é. :/

n°245544
kalex
Posté le 14-11-2002 à 19:52:35  profilanswer
 

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
n°245557
beleg
黑社會
Posté le 14-11-2002 à 20:06:35  profilanswer
 

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.

n°245635
belgique
Posté le 14-11-2002 à 22:23:05  profilanswer
 

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
n°245641
beleg
黑社會
Posté le 14-11-2002 à 22:33:57  profilanswer
 

: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

n°245687
kalex
Posté le 15-11-2002 à 01:04:58  profilanswer
 

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

mood
Publicité
Posté le 15-11-2002 à 01:04:58  profilanswer
 

n°245848
belgique
Posté le 15-11-2002 à 12:59:27  profilanswer
 

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


---------------
Belgian connection

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
java-nombre de lignes d un fichier texte[structures de données] : un editeur de texte formaté
[XML] comparaison de syntaxe, probleme d'occurrenceTexte en commentaire
Formatage de texte en Swingexecuter du code situer dans un fichier texte c possible???
Crée des liens à partir de mots dans un texte (expressions régulières)Insérer le contenu d'un fichier texte dans une feuille HTML
[PHP]taille de texteMettre du texte à la ligne d'une photo
Plus de sujets relatifs à : [expression régulière] Capturer du texte jusqu'à une occurrence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR