[php, shell, ...] Expression régulière

Expression régulière [php, shell, ...] - Divers - Programmation

Marsh Posté le 23-01-2003 à 13:38:26    

Il y'a a :
  - "abc": chaine contenant la chaine "abc"
  - "[^abc]": chaîne qui ne commence pas par a, b ou c
Mais je n'arrive pas a trouver :
- chaine qui ne contient pas "abc"
 
Pourquoi je cherche ça?
J'en aurait besoins pour arriver par exemple a mettre en gras, le texte entouré des balise <i></i> (donc en italique).
Le probleme, c'est que si le texte est : "<i>1</i> 2 <i>3</i>"
Le "2" se met aussi en gras avec l'expression régulière "(<i> )(.*)(</i> )"
 
J'ai pensé alterné "(<i> )(.*)(</i> )" et "(</i> )(.*)(<i> )", avec une boucle for sur le texte jusqu'a ce que toute les balise soient misent, mais avec des balises trop comlexes ça ne marche plus.
 
Donc connaissez vous l'expression régulière dont j'ai besoins? :
(balise1)(texte, sans balise2)(balise2), ce qui résoudrait mon problème.
Ou alors une autre astuce pour le résoudre (php dans ce cas)?

Reply

Marsh Posté le 23-01-2003 à 13:38:26   

Reply

Marsh Posté le 23-01-2003 à 15:08:44    

Ton problème vient du fait que le "*" (comme tous les quantificateurs) des regexp est "avide" : il match le plus de caractères possibles. En perl, tu peux faire suivre un quantificateur ("*", "+"...) du caractère "?", ce qui le forcera au contraire à matcher le moins de caratères possibles.
 
Pour ton exemple ça donne donc : "</i>(.*?)<i>".
 
Pour PHP je ne sais pas vraiment, mais je me suis laissé dire qu'il reconnaissaient les regexp Perl...

Reply

Marsh Posté le 23-01-2003 à 17:38:57    

Dommage, j'ai essayé ce que tu m'as dit ça ne marche pas..
Pourtant les expressions régulières PHP sont celle de posix, donc ça devrait être plutot standard.  
 
Bon, j'essaye a nouveau mon idée, en essayer de la purifier.
Merci de ton aide ;)

Reply

Marsh Posté le 23-01-2003 à 18:49:49    

Justement c'est pas POSIX, c'est une extension Perl. Mais les fonctions PHP en preg_* doivent comprendre cette syntaxe, non ?

Reply

Marsh Posté le 23-01-2003 à 20:36:07    

J'ai essayé mais ça fait une erreur..
Mais je croit que la solution que j'ai trouvé est bonne, ça fonctionne bien pour le moment avec des choses simple. Je continurai ça demain.

Reply

Marsh Posté le 23-09-2009 à 00:02:02    

soluce:
 
sed "s/\(<i>\)\([^\<]\|\<[^\/]\|\<\/[^i]\)*\(<\/i>\)/\1X\3/g" fichier

Reply

Sujets relatifs:

Leave a Replay

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