Expression régulière [php, shell, ...] - Divers - Programmation
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...
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
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 ?
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.
Marsh Posté le 23-09-2009 à 00:02:02
soluce:
sed "s/\(<i>\)\([^\<]\|\<[^\/]\|\<\/[^i]\)*\(<\/i>\)/\1X\3/g" fichier
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)?