Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Regexp et exclusion

15 réponses
Avatar
ASM
Salutatous,

Je m'étais bien promis de ne pas toucher aux expressions régulières !

Pas vu, pas trouvé, pas compris comment exclure une chaîne de caractères
dans une recherche-remplacement d'une chaîne.

C'est pourtant, ce me semble un truc simple

soit :

<textarea id='texto'>
<p>machin</p>
<p>chouette</p>

truc
bidule
muche
</textarea>

à convertir dans un div

<div id='visu'>
<p>machin</p>
<p>chouette</p>
<br>
<br>truc
<br>bidule
<br>muche
</div>

$('visu').innerHTML = $('texto').value.replace(/\n|\r/g,'<br'>);

inserrant des BR entre les balises html, ce n'est pas tip-top :-(


J'y arrive en trichouillant en 2 temps, mais il doit il y avoir plus
propre, non ?

var t = $('texto').value;
t = t.replace(/>(\n|\r)/g,'>').replace(/\n|\r/g,'<br>');

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

10 réponses

1 2
Avatar
Pierre Goiffon
ASM wrote:
soit :

<textarea id='texto'>
<p>machin</p>
<p>chouette</p>

truc
bidule
muche
</textarea>

à convertir dans un div

<div id='visu'>
<p>machin</p>
<p>chouette</p>
<br>
<br>truc
<br>bidule
<br>muche
</div>

$('visu').innerHTML = $('texto').value.replace(/n|r/g,'<br'>);

inserrant des BR entre les balises html, ce n'est pas tip-top :-(

J'y arrive en trichouillant en 2 temps, mais il doit il y avoir plus
propre, non ?


En indiquant qu'on ne veut pas de > avant le saut de ligne et de < après ?

/[^>](n|r)[^<]/g

Avatar
ASM
ASM wrote:
soit :

<textarea id='texto'>
<p style="color:blue">machin</p>
<p>chouette</p>

truc
bidule
muche
</textarea>

à convertir dans un div

<div id='visu'>
<p style="color:blue">machin</p>
<p>chouette</p>
<br>
<br>truc
<br>bidule
<br>muche
</div>

$('visu').innerHTML = $('texto').value.replace(/n|r/g,'<br'>);

inserrant des BR entre les balises html, ce n'est pas tip-top :-(

J'y arrive en trichouillant en 2 temps, mais il doit il y avoir plus
propre, non ?


En indiquant qu'on ne veut pas de > avant le saut de ligne et de < après ?

/[^>](n|r)[^<]/g


C'est presque bon ...

ça me donne :

<p>machin</p>
<p>chouette</p>
<br>ru
<br>idul
<br>uche

y manque des bouts ...

et avec : /[$>](n|r)[^<]/g

j'obtiens :

<p>machin</p>
<p>chouette</p><br>
truc bidule muche

y a comme un mieux mais ...

J'ai un peu de mal avec ce []
qui réagit différemment suivant ce qu'on y met (si j'ai capté !?)

/[ab]/ : contient un 'a' ou un 'b'
me dit-on ici :
http://fr.selfhtml.org/cgiperl/langage/expresreg.htm#caracteres
et non pas que ça "exclu" ce caractère du truc à modifier

en gros :
v = '*' + 'nr' + '*'; // string de recherche
if((v.indexOf('>')<0 || v.indexOf('<')<0)) && v.indexOf('nr')>=0))
v = 'nr';
else '';


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
Olivier Miakinen

/[^>](n|r)[^<]/g


J'ai un peu de mal avec ce []
qui réagit différemment suivant ce qu'on y met (si j'ai capté !?)

/[ab]/ : contient un 'a' ou un 'b'
me dit-on ici :
http://fr.selfhtml.org/cgiperl/langage/expresreg.htm#caracteres
et non pas que ça "exclu" ce caractère du truc à modifier


/[ab]/
a ou b
/[^ab]/
n'importe quel caractère sauf a ou b
/[a-z]/
une lettre minuscule non accentuée (entre a et z)
/[^a-z]/
n'importe quel caractère sauf un parmi [a-z]
/[az-]/
un a, un z ou un -
/[-az]/
un a, un z ou un -
/[^az-]/
n'importe quel caractère sauf a, z ou -
/[]a]/
un ] ou un a
/[^]a]/
n'importe quel caractère sauf ] ou a
/[a]]/
un a, suivi d'un ]
/[^a]]/
un caractère sauf un a, suivi d'un ]


Avatar
Olivier Miakinen

/[ab]/
a ou b
[etc.]


J'allais oublier :

/[^a]/
N'importe quel caractère sauf un a
/[a^]/
Un a ou un ^

;-)

Avatar
ASM
/[ab]/
a ou b
[etc.]


J'allais oublier :

/[^a]/
N'importe quel caractère sauf un a
/[a^]/
Un a ou un ^

;-)


Pit-être qu'y en a encore d'autres (comme les accentuès)
ou : "*tous* les caractères"

Brefle tout ça ne me permet pas d'exclure le remplacement
du dernier et du premier caractère de l'expression recherchée

on cherche les chaines [^>](n|r)[^<]
qu'on remplace par
[*]<br>[*]

ou
on cherche les chaînes (n|r)
mais pas si elles pourraient être >(n|r)<
qu'on remplace par '<br>'


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:

/[a]]/
un a, suivi d'un ]



donc le "]" n'a pas la même signification quand AVANT ou APRES le a :

/[[a]/ [ ou a
/[a[]/ a uivi de ]

j'imagine qu'il en va de même pour tous le caractères "spéciaux" ???

je n'ai jamais rencontré cette règle...
--
Une Bévue

Avatar
Olivier Miakinen

/[a]]/
un a, suivi d'un ]


donc le "]" n'a pas la même signification quand AVANT ou APRES le a :

/[[a]/ [ ou a
/[a[]/ a suivi de ]


S'il est après le a, il ferme la séquence commencée par [. Cette
exception quand il est le premier caractère permet de l'inclure
facilement dans un [...].

Idem pour le ^. Et pour permettre les deux à la fois, le ] est aussi
autorisé comme 2e caractère si le premier est un ^.

j'imagine qu'il en va de même pour tous le caractères "spéciaux" ???


Non. De mémoire, il n'y en a que trois dont la place est importante :
^ : inverse la recherche si au début, vaut un ^ sinon.
] : vaut un ] si au début (éventuellement après le ^), ferme
le tout sinon.
- : vaut un - si au début ou à la fin, sert à indiquer une zone
de caractères sinon.


Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


S'il est après le a, il ferme la séquence commencée par [. Cette
exception quand il est le premier caractère permet de l'inclure
facilement dans un [...].

Idem pour le ^. Et pour permettre les deux à la fois, le ] est aussi
autorisé comme 2e caractère si le premier est un ^.

j'imagine qu'il en va de même pour tous le caractères "spéciaux" ???


Non. De mémoire, il n'y en a que trois dont la place est importante :
^ : inverse la recherche si au début, vaut un ^ sinon.
] : vaut un ] si au début (éventuellement après le ^), ferme
le tout sinon.
- : vaut un - si au début ou à la fin, sert à indiquer une zone
de caractères sinon.


Au quai !

merci pour ces précisions !
--
Une Bévue


Avatar
Olivier Miakinen

soit :

<textarea id='texto'>
<p>machin</p>
<p>chouette</p>

truc
bidule
muche
</textarea>

à convertir dans un div

<div id='visu'>
<p>machin</p>
<p>chouette</p>
<br>
<br>truc
<br>bidule
<br>muche
</div>



Tentative avec les assertions :
t = t.replace(/(?<!>)(n|r)(?!<)/g, '<br>');

Avatar
Elegie
ASM wrote:

Hello,

<textarea id='texto'>
<p>machin</p>
<p>chouette</p>

truc
bidule
muche
</textarea>

à convertir dans un div

<div id='visu'>
<p>machin</p>
<p>chouette</p>
<br>
<br>truc
<br>bidule
<br>muche
</div>



Essayez, en appliquant dans cet ordre :

.replace(/rn/g,"n")
.replace(/(^|[^>])(u0020*)([rn])/gm,"$1$2<br>$3")

La première expression permet de normaliser le saut de ligne à un seul
caractère (IE utilise rn, ce qui est problématique pour l'emploi du
'multiline').

La seconde expression insère les <BR>; u0020 est la valeur code Unicode
pour le caractère espace; la propriété 'multiline' (caractère 'm' juste
après le corps de la regexp) signifie que les assertions '^' et '$' sont
désormais valables pour chaque ligne de la chaîne, et non plus pour la
chaîne entière.


HTH,
Elegie.

1 2