Regexp Multilignes

Résolu
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 24 oct. 2006 à 15:12
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 25 oct. 2006 à 09:57
Bonjour,

Je me trouve confronté à un petit problème concernant les expression régulières:
Voici mon texte:


[EXEMPLE]
ex 1
ex 2
/EXEMPLE

Reste du texte

Mon but est de détecter la présence du tag [EXEMPLE], afin de le remplacer s'il existe, sinon je l'ajoute. Mon problème est qu'il m'est impossible de trouver le texte a cause des retours chariots. Voici l'expression que j'utilise.
/\[EXEMPLE](.*\)\[\/EXEMPLE]/

Je pourrais me dire que je suis seulement pas doué pour les regexp, mais celle-ci marche parfaitement en PHP...
Si je mets tout le texte sur une seule ligne, ca marche aussi. Quelqu'un à une idée?

@+ Ordinastie

PS: le texte est le contenu d'un textarea si ca change quelque chose...

2 réponses

Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
25 oct. 2006 à 09:57
Bonjour,

Merci pour la réponse... mais non :)
.* est ce qu'on appelle "greedy" (pas cherché de traduction), ce qui signifie qu'il prendra le plus large possible.
Par exemple, si mon texte est:
[EXEMPLE]
ex 1
ex 2
/EXEMPLE
ex 3
/EXEMPLE
ex 4

Le texte trouvé sera:
[EXEMPLE]
ex 1
ex 2
/EXEMPLE
ex 3
/EXEMPLE

Il est possible de limiter la réponse à la premiere occurrence trouvée avec le ? je crois.
Le problème est bien causé par les retours chariots car si je mets mon texte sur une seule ligne, je récupère bien ce qu'il faut.

J'ai fini par trouvé l'expression qu'il me fallait:
/\[EXEMPLE](?:\s)*([\w\s,.:-\\\/]*)(?:\s)*\[\/EXEMPLE]/im

Pour ceux qui souhaiteraient une explication:
Je cherche [EXEMPLE]
Suivi de 0, 1 ou plusieurs \s (retours chariots, blancs etc.), dont je ne veux pas retenir la référence (grace à ?:)
Suivi d'un nombre indeterminé de mots, espaces, virgules, points, deux-points, slash/antislash, tirets, dont je garde la référence
Suivi de 0, 1 ou plusieurs \s (retours chariots, blancs etc.), dont je ne veux pas retenir la référence (grace à ?:)
Et enfin qui fini par /EXEMPLE
Le tout, multiligne et insensible à la casse.

J'aurai préférer faire une classe "tout + \s" mais j'arrivai pas et je dois avouer, ca commencait à me saouler.

Voila, en tout cas, merci encore pour la réponse
@+ Ordinastie
3
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
25 oct. 2006 à 07:55
Bonjour,

   ce n'est pas du aux retours chariots
   .* c'est tous les caractères, et ça ne s'arrête pas à /EXEMPLE
   pas très au fait non plus des expressions régulières
      je ferais ça en "plusieurs étapes".

<script type="text/javascript">
 function trait()
 {
  var tmp=document.getElementById("txt");
  var ouv=tmp.value.search(/\[EXEMPLE\]/,"gi");
  var fer=tmp.value.search(/\[\/EXEMPLE\]/,"gi");
  alert ( (ouv!=-1) && (fer!=-1) && (ouv<fer)   );
 }
</script>
<textarea id="txt">
l1
[EXEMPLE]
ex 1
ex 2
/EXEMPLE
</textarea>

il n'y a aucun doute dans mon esprit qu'on peut mieux faire !

<hr />
            Cordialement       Bul    [mon Site]    [M'écrire]
<hr />
0
Rejoignez-nous