Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupéré un titre entre deux string sous angular

    16 mai 2022 à 13:45:16

    Bonjour =),

    Actuellement je dois récupéré les titres des fichiers d'un article qui sont situé dans son contenu ( donc dans une très longue chaine de caractère ),

    pour cela j'ai voulu uttilisé le code suivant :

    Fichiers: string[]=[]; // j'ai déclaré un tableau de string vide nommé fichiers

    verif(){
      this.Fichiers.push(article.contenu.substring(

      article.contenu.indexOf("<a"),

      article.contenu.lastIndexOf("</a>")

    ));

    }

    Le problème c'est que de temps en temps il me retourne un "<h1".

    Également à chaque fois il va bien commencé au premier "<a" qu'il trouve mais il s’arrête au tous dernier "</a>" qu'il va croisé.. ;-;

    Exemple :

    <a href="#"></a>..............<a href="#"> </a>.


    S'il vous plaît aidez moi ;-;.

    Respectueusement,

    Jean-Baptiste

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2022 à 14:36:08

      Tu pourrais faire une boucle, et ajouter l'index de départ en 2e paramètre de indexOf. Par exemple, l'exemple de la doc, en ajoutant l'index 2, on démarre la recherche depuis camel (ant = 0, bison=1, camel=2) et on obtient le bison à l'index 4 : 

      const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
      
      console.log(beasts.indexOf('bison'));
      // expected output: 1
      
      // start from index 2
      console.log(beasts.indexOf('bison', 2));
      // expected output: 4


      Dans ce cas, indexOf retourne le premier élément qu'il trouve, donc tu peux tomber sur le bon </a>.

      Un truc comme ça :

      let index = 0
      while indexOf(<a>, index) != -1 { 
          push substring( indexOf (<a>, index), indexOf(</a>, index) ) //en remettant l'index, avec index = indexOf(<a>, index)
      }

      -
      Edité par Arthur222 16 mai 2022 à 14:37:30

      • Partager sur Facebook
      • Partager sur Twitter
        16 mai 2022 à 16:06:48

        Merci pour ta réponse Arthur !

        Le while fonctionne mise à part une chose,

        j'ai mis Index ++ pour faire tourner la boucle mais ducoup il me retourne des milliers de fois le même A,

        j'ai voulu mettre

        index = article.contenu.indexOf("<a") mais le site crash en boucle,

        Aurait tu une solutions ?

        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2022 à 16:23:14

          Bonjour, je pense qu'il serais plus simple de convertir la chaîne de caractère qui contient la une structure HTML en un objet DOM exploitable et de faire un simple querySelector dessus pour récupérer le contenu du lien.

          // créé un élément vide
          const articleDOM = document.createElement("div");
          
          // insère le contenu HTML dans le nouvelle élément
          articleDOM.innerHTML = article;
          
          
          this.Fichiers.push(
          	// séléctionne le texte du lien
          	articleDOM.querySelector("a").textContent
          )

          • Partager sur Facebook
          • Partager sur Twitter

          suggestion de présentation.

            16 mai 2022 à 16:40:53

            Merci pour ta réponse Samuel, je ne l'ai pas précisé mais nous n'avons pas le droit d’utilisé les  InnerHtml .createElement...

            Mise à part sa y aurait il un moyen de lire le string caractère par caractère et lui dire ( en gros )

            Temps que la chaine de caractère n'est pas lu entièrement{

              Si on lis "<a"{

               temps que on ne lis pas "/a>"{

                lestring += ce qu'on lis

               }

              }

             .push(lestring)

            }

            Désolé si ce n'est pas très claire ':D

            • Partager sur Facebook
            • Partager sur Twitter
              16 mai 2022 à 17:09:17

              Pour la méthode avec le while, tu peux forcer le prochain index avec un ++ :

              while(txt.indexOf("<a>", index) != -1){
                  index = txt.indexOf("<a>", index);
                  console.log(index);
                  index++
              }

              Pour la formulation du code du dernier message, tu peux regarder "split('')" pour séparer une chaine de caractères, et "join" pour retransformer le tableau en chaine. Dans ce cas tu pourras faire un == pour savoir si tu tombes sur "<", mais c'est pas très précis si tu as "<a><h1></h1></a>"

              • Partager sur Facebook
              • Partager sur Twitter
                16 mai 2022 à 17:14:49

                C'est exactement sa il y a des h1 dans certain <a></a> ;-; et sinon avec le index ++ il me retourne plein de fois le même <a>.

                • Partager sur Facebook
                • Partager sur Twitter
                  16 mai 2022 à 18:09:01

                  Tu as essayé à nouveau avec le code?

                  Car chez moi ça donne bien 2 index pour cet exemple :

                  let txt = "<a><h1>a1</h1></a>milieu<a>a2</a>";
                  let index = 0;
                  
                  while(txt.indexOf("<a>", index) != -1){
                      index = txt.indexOf("<a>", index);
                      console.log(index);
                      index++
                  }



                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 mai 2022 à 7:08:45

                    Bonjour, pourquoi n'as tu pas le droit n'utiliser le DOM ? Est-ce que ton code est exécuter par nodejs ?

                    Si ton code est exécuter par Nodejs est que tu as accès à NPM une solution qui peut être intéressante est d'utiliser la librairie jsdom

                    qui te permet de virtualiser un document en Nodejs.

                    $ npm i --save jsdom

                    Tu peux créé la structure en passant le HTML au constructeur de jsdom

                    const {JSDOM} = require('jsdom')
                    
                    const virtualDocument = new JSDOM(article);
                    
                    const doc = virtualDocument.window.document;
                    
                     
                     
                    this.Fichiers.push(
                        // séléctionne le texte du lien
                        doc.querySelector("a").textContent
                    )
                    • Partager sur Facebook
                    • Partager sur Twitter

                    suggestion de présentation.

                      17 mai 2022 à 9:40:15

                      Bonjour bonjour !

                      Merci beaucoup Samuel ça fonctionne vraiment bien !

                      Sinon j'ai aussi trouvé la solution entre temps pour la version avec le substring

                      mon erreur était que j'initialisais ma variable index dans ma fonction et non en global,

                      ce qui faisait crash mon

                      this.index += article.contenu.indexOf("<a", this.index);

                      Voilà voilà, merci beaucoup à vous deux pour votre aide !

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Récupéré un titre entre deux string sous angular

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown