Forums Webou.net - Hébergement gratuit et sans publicités avec PHP/MySQL Webou Webou Pro
Recherche avancée  
*
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?
18 Novembre 2019, 23:29:04


Connexion avec identifiant, mot de passe et durée de la session


Pages: [1]   Bas de page
  Imprimer  
Auteur Fil de discussion: Problème avec une boucle apparemment sans fin en JS  (Lu 2102 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Keanjyto
Bavard
***
Hors ligne Hors ligne

Messages: 170


Voir le profil WWW
« le: 10 Novembre 2009, 19:11:27 »

Bonjour à tous,

je travail sur un script qui générera automatiquement une table des matières à partir d'un article en HTML, j'utilise du javascript mais le code se bloque à la boucle 'while'.
Voici le code du script JS :


// Script d'extraction des titres HTML pour générer un sommaire automatiquement
function mk_tdm(texte)
   {
   var tdm = document.getElementById('sommaire');
   // L'expression régulière pour les titres
   var nb = /(<h[1-6]{1}(\s[^<>]*){0,1}>)[^<>]{1,}(<\/h[1-6]{1}>)/gi;
   tdm.value = "<div class=\"center\" style=\"background: #DDE;\">\n\t<strong>Table des mati&egrave;res</strong>\n</div>\n<div style=\"border: 1px solid #DDE; padding: 6px;\">\n";
   // La première occurence doit être traitée à part
   var tab = nb.exec(texte);
   tdm.value += "\t" + tab[0];
   // On traite ensuite les suivantes
   // Problème : le script semble se bloquer à la boucle et ne plus en sortir
   while(true) { tab = nb.exec(texte); if(tab[0]==null) { break; } tdm.value += "\n\t" + tab[0]; }
   // Du coup, tout ce qui vient à partir d'ici n'est pas exécuté
   tdm += "</div>";
   }


Le problème vient du fait que 'RegExp.exec(texte)', d'après ce que j'ai pu lire un peu partout sur le Net (CCM, etc.), doit rendre dans un tableau toutes les occurrences trouvées, mais ce n'est pas le cas : à la place il rend une occurrence par exécution, donc je dois faire une boucle 'while' sur 'RegExp.exec(texte)' pour avoir tous les titres. Seulement ce qui se trouve après la boucle n'est pas exécuté, si je veux y rajouter du code encore après il sera ignoré et c'est ce que je souhaite corriger... Sur l'image (cliquez si vous voulez agrandir), on voit qu'il manque une balise fermante "</div>' dans la zone de texte du sommaire.



Merci d'avance à ceux ou celle qui prendront du temps pour m'aider, je reste à votre disposition pour d'éventuels détails ^^

Cordialement,
Keanjyto.
Journalisée
Forums Webou.net - Hébergement gratuit et sans publicités avec PHP/MySQL
« le: 10 Novembre 2009, 19:11:27 »

 Journalisée
Coleim
Sr. Member
****
Hors ligne Hors ligne

Messages: 433



Voir le profil WWW
« Répondre #1 le: 10 Novembre 2009, 22:54:06 »

Déjà, while(true), c'est moche.
Je pense pas que ça vienne de la, mais change déjà ça  Clin d'oeil

Code:
do {
    tab = nb.exec(texte);
    tdm.value += "\n\t" + tab[0];
} while (tab[0]==null);

ou

Code:
while(tab[0]==null) {
   tab = nb.exec(texte);
   tdm.value += "\n\t" + tab[0];
}


Et sinon, essaye comme test :

Code:
while(tab) {
   tab = nb.exec(texte);
   tdm.value += "\n\t" + tab[0];
}


Je sais pas si ça marche mais bon, à tester  Souriant
Journalisée

"Kirby, c'est le seul héros qui sauve le monde en voulant récupérer son gâteau à la fraise !"
chrmag
Bavard
***
Hors ligne Hors ligne

Messages: 131


Voir le profil WWW
« Répondre #2 le: 10 Novembre 2009, 23:19:48 »

Citation
Code:
while(true) { tab = nb.exec(texte); if(tab[0]==null) { break; } tdm.value += "\n\t" + tab[0]; }

Dans le test pour quitter, normalement quand il n'y a pas de match
Code:
tab == null
et donc
Code:
tab[0] == undefined
Donc ton test deverait etre:
Code:
if (tab == null) break;
ou encore
Code:
if (!tab) break;

PS: je ne vois pas pourquoi la premiere occurence deverait etre traitee autrement...
Tu peux essayer:
Code:
// ...
tdm.value = "<div class=\"center\" style=\"background: #DDE;\">\n\t<strong>Table des mati&egrave;res</strong>\n</div>\n<div style=\"border: 1px solid #DDE; padding: 6px;\">";
// On traite les occurences.
var tab;
while (tab = nb.exec(texte)) {
  tdm.value += "\n\t" + tab[0];
}
tdm.value += "</div>";
Journalisée
Keanjyto
Bavard
***
Hors ligne Hors ligne

Messages: 170


Voir le profil WWW
« Répondre #3 le: 11 Novembre 2009, 01:04:05 »

Bonsoir à tout les deux,

J'ai testé soigneusement vos propositions et elles ne fonctionnent pas malheureusement... sauf la dernière de Chrmag ^^
Je vous remercie tout les deux pour l'aide.

"je ne vois pas pourquoi la premiere occurence deverait etre traitee autrement..."
=> Au début, j'avais utilisé un "Pour" du coup il me fallait connaître le nombre exact d'occurrences et pour cela je devais d'abord exécuter la première occurrence (et récupérer la valeur avec "tab.length" mais souvent la longueur ne correspondait pas au nombre de titres u_u), par contre avec un "Tant que" c'est parfait et c'est plus esthétique, merci Sourire

Bonne continuation.

Cordialement,
Keanjyto.
« Dernière édition: 11 Novembre 2009, 01:48:00 par Keanjyto » Journalisée
Pages: [1]   Haut de page
  Imprimer  
 
Aller à:  

Propulsé par MySQL Propulsé par PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Dilber MC Theme by HarzeM
Page générée en 0.034 secondes avec 21 requêtes.