expression rationnelle sous-masque un peu complexe
4 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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:
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:
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 !
Le Sun, 07 Mar 2004 19:00:19 +0100, Stephane Chazelas a écrit:
En admettant que les textareas ne soient pas nestees:
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>
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 !
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 !
Le Sun, 07 Mar 2004 16:11:47 -0400, Christophe PEREZ a écrit:
(*) pouvant déjà contenir saut de ligne et tabulation
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.
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.
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.