OVH Cloud OVH Cloud

expression rationnelle sous-masque un peu complexe

4 réponses
Avatar
Christophe PEREZ
Bonjour,

J'ai un peu peur d'être HS ici aussi, mais je ne sais pas trop où aller
d'autre.

Je voudrais faire une expression rationnelle (compatible perl, pour devel
en php) pour solutionner la problématique suivante :

A) dans une chaîne pouvant contenir des sauts de ligne, remplacer tous
ces sauts de lignes, sauf ceux compris dans une balise textarea, donc ne
pas remplacer les \n qui sont dans : <textarea[^>]*>.*</textarea>
^ ici
Or, je n'y parviens pas.

B) Je me suis dit que, pour palier à ça, j'allais :
1) remplacer dans <textarea[^>]*>.*</textarea>, tous les sauts de ligne
par un chaine improbable ailleurs SAUT_DE_LIGNE_TEXTAREA
2) puis remplacer tous les sauts de ligne par la valeur que je souhaite
3) puis remplacer tous les SAUT_DE_LIGNE_TEXTAREA par des sauts de ligne.

Je sais faire les 2) et 3), mais le 1) reste toujours un problème pour
moi.
Si quelqu'un pouvait m'aiguiller, ça me rendrait bien service, sachant
toutefois que la problématique reste celle du A) et que le B) ne serait
qu'un palliatif si le A) n'est pas faisable directement.

Merci d'avance.

--
Christophe PEREZ
Écrivez moi sans _faute !

4 réponses

Avatar
Stephane Chazelas
2004-03-07, 12:54(-04), Christophe PEREZ:
[...]
Je voudrais faire une expression rationnelle (compatible perl, pour devel
en php) pour solutionner la problématique suivante :

A) dans une chaîne pouvant contenir des sauts de ligne, remplacer tous
ces sauts de lignes, sauf ceux compris dans une balise textarea, donc ne
pas remplacer les n qui sont dans : <textarea[^>]*>.*</textarea>
^ ici
Or, je n'y parviens pas.


En admettant que les textareas ne soient pas nestees:

perl -0777 -pe 's%n(?!(?:(?!<textarea).)*?</textarea%<br>%gs'

Cherche les n qui ne sont pas suivies d'un </textarea> non
précédé d'un <textarea>.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Christophe PEREZ
Le Sun, 07 Mar 2004 19:00:19 +0100, Stephane Chazelas a écrit:

En admettant que les textareas ne soient pas nestees:


"nestees" ?

perl -0777 -pe 's%n(?!(?:(?!<textarea).)*?</textarea%<br>%gs'
1 2 3 3 2


Bon, alors :
1) j'ai bien dit compatible perl, mais pas expression perl ;-)
2) on la ferme où la 3ième ? J'avoue une fois de plus ne rien comprendre
(pour l'instant, à chaud) à l'expression et j'ai donc essayé en fermant
</textarea) mais à répond justement au cas B) et pas au cas A).

Alors soit je ne l'utilise pas correctement dans mon preg_replace() de
php, soit je ferme au mauvais endroit.

Cherche les n qui ne sont pas suivies d'un </textarea> non
précédé d'un <textarea>.


C'est à priori tout à fait ce que je veux.
Mais au cas ou je n'aurais pas été suffisamment explicite, voici
_exactement_ ce que je veux :

chaîne initiale :
<balise1>
<balise2>
<textarea ...>du texte
sur plusieurs
lignes</textarea>
</balise2>
<balise1>

chaîne résultat :

<balise1>
MACHAINE <balise2>
MACHAINE <textarea ...>du texte
sur plusieurs
lignes</textarea>
MACHAINE </balise2>
MACHAINE<balise1>

Mais pour être encore plus clair, je veux juste une expression
régulière (moi, je suis obligé de faire en plusieurs) de façon a
indenter correctement du code HTML en partant de :

<balise1>(*)<balise2>(*)<textarea ...>du texte
sur plusieurs lignes</textarea>(*)</balise2>(*)<balise1>(*)

(*) pouvant déjà contenir saut de ligne et tabulation

pour arriver à :
<balise1>
<balise2>
<textarea ...>du texte
sur plusieurs
lignes</textarea>
</balise2>
<balise1>

je ne sais pas si je suis bien clair.

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
Christophe PEREZ
Le Sun, 07 Mar 2004 16:11:47 -0400, Christophe PEREZ a écrit:

(*) pouvant déjà contenir saut de ligne et tabulation


Pfff... ou texte quelconque, évidemment.

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
Stephane Chazelas
2004-03-07, 16:11(-04), Christophe PEREZ:
Le Sun, 07 Mar 2004 19:00:19 +0100, Stephane Chazelas a écrit:

En admettant que les textareas ne soient pas nestees:


"nestees" ?


Ca doit etre imbriquees en Francais.

perl -0777 -pe 's%n(?!(?:(?!<textarea).)*?</textarea%<br>%gs'
1 2 3 3 2


Bon, alors :
1) j'ai bien dit compatible perl, mais pas expression perl ;-)
2) on la ferme où la 3ième ? J'avoue une fois de plus ne rien comprendre
(pour l'instant, à chaud) à l'expression et j'ai donc essayé en fermant
</textarea) mais à répond justement au cas B) et pas au cas A).


Oups.

~$ perl -0777 -pe '
quote> s%n(?!(?:(?!<textarea).)*?</textarea)%nMACHAINE%gs' << E
heredoc> <balise1>
heredoc> <balise2>
heredoc> <textarea ...>du texte
heredoc> sur plusieurs
heredoc> lignes</textarea>
heredoc> </balise2>
heredoc> <balise1>
heredoc> E
<balise1>
MACHAINE <balise2>
MACHAINE <textarea ...>du texte
sur plusieurs
lignes</textarea>
MACHAINE </balise2>
MACHAINE<balise1>
MACHAINE

"(?!...)", c'est le "negative look ahead".

C'est a dire que:

"(?!re1)re2"

matche re2 si re1 ne matche pas au même endroit.

"(?!<textarea)."
matche donc 1 caractère, à condition que "<textarea" ne matche
pas à cet endroit.

Donc (?:(?!<textarea).)*? est une chaine de caractère ne
contenant pauuuuuuuuuuuus "<textarea" (enfin, pas tout à fait, mais en
l'occurrence oui).

n(?![chaine sans <textarea]</textarea)

c'est donc n s'il n'est pas suivi d'un </textarea précédé d'une
chaine sans <textarea.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]