délimiteur de signature ?

19 réponses
Avatar
Gérald Niel
Bonjour,

pas très doué en JS, pour un client web affichant des message en
provenance de usenet je cherche une regexp pour traiter le délimiteur
de signature et afficher ce qui est en dessous dans un <div>.

J'ai cherché un peu sur le net mais pas trouvé…

En php la regex ressemble à ça, mais je ne sais pas transformer en JS :
'/\n-- \n((.|\n)*|$)/'

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance, soit
par mauvaise foi. -+- Hem Day -+-

10 réponses

1 2
Avatar
SAM
Le 17/10/14 20:27, Gérald Niel a écrit :
Bonjour,

pas très doué en JS, pour un client web affichant des message en
provenance de usenet je cherche une regexp pour traiter le délimiteur
de signature et afficher ce qui est en dessous dans un <div>.

J'ai cherché un peu sur le net mais pas trouvé…

En php la regex ressemble à ça, mais je ne sais pas transformer en JS :
'/n-- n((.|n)*|$)/'

@+




en attendant qu'Olivier te réponde sur le groupe approprié :
fr.comp.lang.regexp


Je propose une autre soluce :

/(.|s)*-- n/

alert('Cordialement,n-- nStéphane Moriauxnavec/with iMac-intel 27" &
Mac OS X 10.6.8'.replace(/(.|s)*-- n/,''))


à essayer :
<http://stephane.moriaux.pagesperso-orange.fr/truc/js_regexp_testeur>

Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
SAM
Le 18/10/14 00:07, SAM a écrit :

en attendant qu'Olivier te réponde

Je propose une autre soluce :



/(.|s)*-- n/


monDiv.InnerHTML = texto.replace(/(.|s)*-- n/,'');

et, pour être honnête avec Olivier, à essayer ici :
<http://stephane.moriaux.pagesperso-orange.fr/truc/js_regexp_testeur_om>


Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
SAM
Le 18/10/14 00:58, SAM a écrit :
>
> Je propose une autre soluce :



et même encore plus simple (trop facile ! doit y avoir une erreur !)

var texto = le post complet (le texte et sa signature)

texto = texto.split(/n-- n/);

document.getElementById('texte').innerHTML = texto[0];
document.getElementById('signature').innerHTML = texto[1];


<pre id="texte"></pre>
<pre id="signature"></pre>


Ça fonctionne aussi avec :
texto = texto.split('n-- n');


Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
Olivier Miakinen
[diapublication, suivi vers fr.comp.lang.regexp]

Bonjour Gérald,

Le 17/10/2014 20:27, Gérald Niel a écrit :

pas très doué en JS, pour un client web affichant des message en
provenance de usenet je cherche une regexp pour traiter le délimiteur
de signature et afficher ce qui est en dessous dans un <div>.

J'ai cherché un peu sur le net mais pas trouvé…



Tout d'abord, je signale comme l'a fait SAM qu'il y a un groupe consacré
aux regexps, et j'y fais suivre la discussion.

Maintenant, que tu n'aies pas trouvé de page web expliquant comment
passer des regexp de PHP à JavaScript n'est pas très étonnant : en
général il n'y a rien à faire tant que tu n'utilises pas de syntaxe
très compliquée (surtout si en PHP tu utilises les PCRE plutôt que
les antiques regexp Posix).

En php la regex ressemble à ça, mais je ne sais pas transformer en JS :
'/n-- n((.|n)*|$)/'



Eh bien, laisse-la telle quelle, elle fonctionnera. Cela dit, elle
est un peu trop compliquée, déjà en PHP.

(.|n)*|$ :
Si la signature est vide, le (.n)* se résumera à une chaîne vide,
en fin de chaîne, exactement la même que celle que tu trouves
avec $. Ce $ est donc inutile, et on peut remplacer cette partie
par : (.|n)*

Donc : '/n-- n((.|n)*)/'

Maintenant, si tu n'as pas besoin de supprimer le délimiteur de
signature lui-même, pour ne garder que ce qui est après (contrairement
à ce qu'a supposé SAM dans ses réponses), tu peux ausi retirer la
paire de parenthèses qui ne sert plus à rien :

'/n-- n(.|n)*/'

Enfin, avec PCRE en PHP, tu peux simplifier l'écriture (.|n) avec le
flage PCRE_DOTALL (/s) qui demande au . de matcher aussi les sauts
de ligne.

Donc, en PHP : '/n-- n.*/s'

Malheureusement ce flag est inconnu en JavaScript. Il existe une autre
méthode, mais tu la trouveras peut-être moins lisible que (.|n), qui
consiste à mettre dans des [] une classe et son contraire, par exemple
[sS].

D'où, en PHP ou JavaScript : '/n-- n[sS]*/'

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 18/10/2014 00:07, SAM a écrit :

Je propose une autre soluce :

/(.|s)*-- n/



Plutôt : /(.|n)*n-- n/

Sinon, il détectera une signature dans le message suivant (pourvu que
l'espace ne soit pas virée en fins de ligne) :

+-------+--
+ Salut |
+-------+
Avatar
Olivier Miakinen
Le 19/10/2014 00:03, SAM a écrit :

et même encore plus simple (trop facile ! doit y avoir une erreur !)

var texto = le post complet (le texte et sa signature)

texto = texto.split(/n-- n/);

document.getElementById('texte').innerHTML = texto[0];
document.getElementById('signature').innerHTML = texto[1];



Oui, c'est parfait ! Je ne fais pas suivre vers fcl.regexp car
c'est plus du JS que des regexp.
Avatar
Gérald Niel
Le Lundi 20 octobre 2014 à 00:19 UTC, Olivier Miakinen écrivait sur
fr.comp.lang.javascript :

var texto = le post complet (le texte et sa signature)

texto = texto.split(/n-- n/);

document.getElementById('texte').innerHTML = texto[0];
document.getElementById('signature').innerHTML = texto[1];



Oui, c'est parfait ! Je ne fais pas suivre vers fcl.regexp car
c'est plus du JS que des regexp.



Oui, merci. Car à la base c'est bien plus avec la syntaxe de JS que
j'ai un soucis.

Car j'ai testé ça, mais ça ne fonctionne à priori pas.
J'ai texto[1] qui est 'undefined'.
Et texto[0] qui est strictement égal à texto.

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance, soit
par mauvaise foi. -+- Hem Day -+-
Avatar
Gérald Niel
(suivi sur fr.comp.lang.regexp, car il faut bien en mettre un, restons
doc là pour les expressions régulières)

Le Lundi 20 octobre 2014 à 00:11 UTC, Olivier Miakinen écrivait sur
fr.comp.lang.javascript :

Maintenant, si tu n'as pas besoin de supprimer le délimiteur de
signature lui-même, pour ne garder que ce qui est après (contrairement
à ce qu'a supposé SAM dans ses réponses), tu peux ausi retirer la
paire de parenthèses qui ne sert plus à rien :

'/n-- n(.|n)*/'



En fait si. J'ai besoin d'opérer deux traitement différents.

Le premier pour ce que je présente dans la fenêtre du navigateur.
Je ne veux pas toucher à la structure du document transporté dans le
body.
Je veux juste ne pas afficher le délimiteur, et afficher tout ce qui
se trouve après dans un div, ou autre (peu importe).

Ensuite si je répond à un message, que je le cite en intégralité, je
veux supprimer la signature.

(ceci en JS)

Donc, en PHP : '/n-- n.*/s'



Je vais faire une dérive donc, ceci, serait correct en PHP ? :

$body = preg_replace('/n-- n.*/s',"n[signature]$1[/signature]", $body);

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance, soit
par mauvaise foi. -+- Hem Day -+-
Avatar
SAM
Le 20/10/14 06:40, Gérald Niel a écrit :
Le Lundi 20 octobre 2014 à 00:19 UTC, Olivier Miakinen écrivait sur
fr.comp.lang.javascript :

var texto = le post complet (le texte et sa signature)

texto = texto.split(/n-- n/);





document.getElementById('texte').innerHTML = texto[0];
document.getElementById('signature').innerHTML = texto[1];





j'ai testé ça, mais ça ne fonctionne à priori pas.
J'ai texto[1] qui est 'undefined'.
Et texto[0] qui est strictement égal à texto.



Un exemple concret (en ligne) ?

Les posts à analyser sont bien en texte "brut" ?

En particulier, les 'n' n'y sont-ils pas des '<br>' ??



Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
Olivier Miakinen
Le 20/10/2014 06:40, Gérald Niel a écrit :

var texto = le post complet (le texte et sa signature)

texto = texto.split(/n-- n/);





document.getElementById('texte').innerHTML = texto[0];
document.getElementById('signature').innerHTML = texto[1];





Oui, c'est parfait ! Je ne fais pas suivre vers fcl.regexp car
c'est plus du JS que des regexp.



Oui, merci. Car à la base c'est bien plus avec la syntaxe de JS que
j'ai un soucis.

Car j'ai testé ça, mais ça ne fonctionne à priori pas.
J'ai texto[1] qui est 'undefined'.
Et texto[0] qui est strictement égal à texto.



Si ça se trouve, contrairement à PHP qui traduit automatiquement
les rn en n à la lecture et inversement en écriture, JavaScript
laisse les rn.

Je te propose :
texto = texto.split(/r?n-- r?n/);
1 2