11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous.


Je me suis très récemment mis au Javascript. Ma foi, c'est pas très compliqué. Cependant je me trouve confronté à un problème, qui pour moi est de taille : les expressions régulières.

Pour une mise en situation, imaginons une chaine de ce type :

BOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNJOOUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURR !!!!!!!!!!!









CAAAAAAAAAAAA VAAAAAAAA BIEEEEEEEEEEEEEEN ?


Pas très pratique à lire, vous y conviendrez bien ! Smiley lol

Je pense, donc, que la solution la plus simple pour nettoyer ceci serait les regex...histoire d'afficher :

Bonjour !

Ca va bien ?


qui sera incroyablement plus simple (et moins lourd) à lire.

Cependant je cale complètement. J'ai beau lire par-ci par-là les explications que je trouve, je n'arrive à rien. -_-' Non, vraiment...j'ai essayé, mais non.

Alors je me demandais si, une fois n'est pas coutume, quelqu'un pourrait m'aider à construire la regex miracle ? Je sais que ce n'est pas là l'habitude de la maison et je comprends très bien pourquoi. Mais bon...autant quand même essayer. Smiley confused

J'aimerais, donc, arriver à un résultat tel que :

- tout caractère (insensible à la casse) répété plus de trois fois ne soit affiché qu'une fois ;
- toute succession d'au moins deux retours à la ligne n'en fasse qu'une.

Je précise également que je travaille directement sur le code HTML, récupéré via document.evaluate.

xpath('//div[@class="message"]').snapshotItem(0).innerHTML


Il s'agit en réalité d'un script pour GreaseMonkey.
En tout cas, un gros gros merci d'avance. Smiley confused
Modifié par SolykZ (14 Sep 2008 - 16:56)
Me revoici déjà, avec la moitié de ma solution : j'ai trouvé comment supprimer les retours à la ligne superflus :

var Repetitions = new RegExp("(<br>\n){3,}", "gi");


Ce qui donne donc ceci, en production :

 if ((currentHref.indexOf('view.php') != -1) || (currentHref.indexOf('enquete.php') != -1)) {
  var Rapports = xpath('//div[@class="message"]');
  var Repetitions = new RegExp("(<br>\n){3,}", "gi");
  
  for (var i = 0; i < Rapports.snapshotLength ; i++) {
   var CeRapport = Rapports.snapshotItem(i);
   var CeRapportContenu = CeRapport.innerHTML;
   CeRapport.innerHTML = CeRapportContenu.replace(Repetitions, "$1");
  }
 }


Je cherche encore pour la répétition de caractères...je sens que je vais y finir ma nuit. Smiley ohwell
Il faudrait essayer ce genre de regexp je pense :

message = message.replace(/(.)\1{2,}/g, '$1');

Explication : Tout caractère répété trois fois ou plus est réduit à un seul. Exemple : aaabbb => ab
Oh, nickel ! Smiley lol

Et finalement j'ai opté pour ta notation, je la trouve plus simple que celle employée précédemment. Smiley smile

Là je vais regarder à pouvoir utiliser les deux en même temps (via le pipe ?), pour l'instant je n'arrive pas à grand chose mais je continue mes recherches, je me rappelle avoir lu des explications hier à propos de cela. Smiley smile


Un énorme merci à toi, tu m'enlèves une sérieuse épine du pied !! Smiley lol
Le problème est résolu ! Smiley smile

Voici le code obtenu au final :

 if ((currentHref.indexOf('view.php') != -1) || (currentHref.indexOf('enquete.php') != -1)) {
  var Rapports = xpath('//div[@class="message"]');
  
  for (var i = 0; i < Rapports.snapshotLength ; i++) {
   var CeRapport = Rapports.snapshotItem(i);
   var CeRapportContenu = CeRapport.innerHTML;
   Traitement = CeRapportContenu.replace(/(<br>\n){3,}/gi, "$1$1");
   Traitement = Traitement.replace(/(.)\1{2,}/g, "$1");
   CeRapport.innerHTML = Traitement;
  }
 }


Concernant le premier remplacement, le double $1 est fait exprès, ceci histoire d'espacer quand même un minimum les lignes, que tout ne soit pas complètement serré.

Mais en tout cas, un tout grand merci pour ton aide Quentin ! Smiley cligne
Modifié par SolykZ (14 Sep 2008 - 16:56)
Juste une question : quel est l'avantage d'exécuter cette manip côté client par rapport à un script Php ? J'imagine qu'un UA sans JS sera un peu pénalisé, non ?
Hé bien disons qu'à la base oui j'aurais préféré traiter ça en PHP...déjà pour la simple (donc bonne) raison que c'est un langage que je connais mieux que le JS.

Mais pour répondre à ta question, il s'agit d'un script pour GreaseMonkey, une extension pour Firefox. Smiley smile De fait les utilisateurs employant ce genre d'extensions laisseront à coup sûr JS activé. Smiley smile

Tiens je devrais tester, pour voir. Smiley smile



Après test (JS désactivé via la Web Developer toolbar) les scripts continuent à fonctionner correctement. Smiley cligne Smiley edit Modifié par SolykZ (15 Sep 2008 - 08:38)[/edit]