Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lire le tableau généré par un preg_match_all

    28 avril 2021 à 19:39:32

    Bonjour à tous,

    je me résous à vous exposer mon problème qui me prend la tête depuis des mois, en vain. D'abord, le but de mon code est d'extraire un format de texte qui correspond à des photos publiées sur un forum (pour les trier ensuite).

    J'utilise donc la fonction preg_match_all appliqué sur du texte extrait d'une base de données. Le masque marche déjà très bien. Sauf que je n'arrive pas du tout à extraire les lignes du tableau renvoyé dans le §matches du preg_match_all . J'obtiens ça dans cette variable :

    array (
      0 =>
      array (
        0 => '20200421193357.JPG',
        1 => '20200421193435.jpg',
        2 => '20200421193505.jpg',
        3 => '20200421193730.png',
      ),
    )

    Comment extraire et afficher ces 4 foutues lignes ? Ca doit pas être compliqué je pense (j'en vois déjà qui rigolent derrière leur clavier :p) J'ai bien essayé de comprendre ce tableau de tableau renvoyé mais j'en peux plus là :( Déjà juste un print_r(§matches[0][0]); ne renvoit strictement rien o_O. Pas prêt de faire la boucle :).

    Merci vraiment pour votre aide. Vous aurez toute ma reconnaissance éternelle :ange:

    • Partager sur Facebook
    • Partager sur Twitter

    Aucun problème, que des solutions...

      29 avril 2021 à 13:15:59

      Est-ce que tu peux nous montrer la partie de code qui nous intéresse ici stp ?

      Mais normalement un $matches[0][0] (et non §) devrait fonctionner oui.

      • Partager sur Facebook
      • Partager sur Twitter
      $2b||!$2b
        30 avril 2021 à 17:38:06

        //sélection dans un tableau des posts avec des photos en format cphxxx
        $tablo = mysql_query("SELECT post_text FROM `phpbb_posts` WHERE `post_text` LIKE '%cph%'");
        $mask = '![0-9]+\.(?:jpeg|jpg|png|JPG)!';
        
        //test sur la 1ère ligne du tablo
        $row = mysql_fetch_array($tablo);
        $txt = $row[0];
        preg_match_all($mask, $txt, $out);
        print_r($out[0][0]);
        Salut skuti, merci de te pencher sur mon souci . J'utilise HAPedit, pas de risque de me tromper entre § et $ ;). J'ai mal retranscrit dans mon post le $matches :lol:
        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2021 à 20:17:55

          Est-ce que tu pourrais faire ceci et nous montrer le résultat stp?
          echo '<pre>';var_dump($out);
          var_dump($out[0]);
          var_dump($out[0][0]);die;
          • Partager sur Facebook
          • Partager sur Twitter
          $2b||!$2b
            11 mai 2021 à 19:58:54

            skuti a écrit:

            Est-ce que tu pourrais faire ceci et nous montrer le résultat stp?

            echo '<pre>';var_dump($out);
            var_dump($out[0]);
            var_dump($out[0][0]);die;


            Désolé de la réponse tardive, j'ai eu des soucis de connections et de mot de passe. Alors que ce soit avec un mysql_fetch_array ou mysql_fetch_row, j'ai en retour :

            Array

            array(1) {
              [0]=>
              array(0) {
              }
            }
            array(0) {
            }
            NULL
            

            Pourtant, en testant mon preg_match-all avec un texte contenant 3 photos sur ce site, j’obtiens exactement ce que je veux :

            array (
              0 =>
              array (
                0 => '20180320125004.jpeg',
                1 => '20180320125029.jpeg',
                2 => '20180320125049.png',
              ),
            )

            -
            Edité par Xaxa Bibi 11 mai 2021 à 19:59:44

            • Partager sur Facebook
            • Partager sur Twitter

            Forza GT

              11 mai 2021 à 22:07:26

              En fait j'ai juste l'impression que ton texte est vide du coup.

              Tu pourrais faire un var_dump() comme ci-dessous juste après le mysql_fetch_array($tablo); :

              var_dump($row);die;

              Mais s'il n'y a rien dans ta BDD c'est sur que ton preg_match de va rien trouvé.

              • Partager sur Facebook
              • Partager sur Twitter
              $2b||!$2b
                12 mai 2021 à 19:32:35

                Salut,

                Ca sort ça :


                array(2) { [0]=> string(130) "[img:2rpq6dcm]https://www.monsite.fr/upload/cph20190212194309.jpg[/img:2rpq6dcm]" ["post_text"]=> string(130) " [img:2rpq6dcm]https://www.monsite.fr/upload/cph20190212194309.jpg[/img:2rpq6dcm]" }

                avec un while pas de souci ça me sort parfaitement bien toutes les publications qui contiennent une photo :).  Je teste pour l'instant le preg_match sur la première ligne avant d'aller plus loin.

                • Partager sur Facebook
                • Partager sur Twitter

                Forza GT

                  17 mai 2021 à 18:56:53

                  en fait le souci vient de l'extraction de '$row' car quand je mets une vraie chaine de texte dans la variable $txt (donc à la place de $row[0])

                  il me sort bien un tableau avec le résultat attendu.

                  -
                  Edité par Xaxa Bibi 17 mai 2021 à 18:59:26

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Forza GT

                    18 mai 2021 à 7:42:13

                    Le seul truc que je te conseille c'est d'utiliser preg_match() au lieu de preg_match_all car tu n'as pas un texte et de faire un var_dump(); de $txt juste avant ton preg_match pour vérifier que ton $txt est correcte. Si c'est vide, c'est à voir plus haut et potentiellement faire une condition pour ne rien faire si $txt est vide.

                    Sans tester c'est compliqué.

                    -
                    Edité par skuti 18 mai 2021 à 7:43:19

                    • Partager sur Facebook
                    • Partager sur Twitter
                    $2b||!$2b
                      22 mai 2021 à 15:36:16

                      Salut,

                      Alors en faisant un var_dump sur mon $txt ça m'affiche bien la 1ère publication de ma base sql qui contient une photo publiée :

                      $txt = "sortie en septembre, une photo [img]https://monsite.fr/upload/cph20190212194309.jpg[/img]"

                      Mais la grande question : est-ce bien une chaine de texte ??? car si je vais plus loin avec juste preg_match appliqué à $txt, je n'ai plus rien comme si je travaillais une variable que n'est pas une chaine. Je ne pourrai pas échapper au preg_match_all, car une publication peut contenir plusieurs photos que je devrais récupérer avec le masque. Je ne comprends vraiment plus rien.

                      EDIT : un strlen sur txt renvoie bien le nb de caractères. C'est donc bien une chaine que le preg_match n'évalue pas :waw:

                      -
                      Edité par Xaxa Bibi 22 mai 2021 à 15:49:58

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Forza GT

                        22 mai 2021 à 20:29:02

                        Tu veux dire que juste après ton preg_match_all ta variable $txt est vide alors qu'avant elle était pleine ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        $2b||!$2b
                          23 mai 2021 à 11:22:40

                          et c'est bien une chaine puisque un strlen renvoie bien le nb de caracatères.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Forza GT

                            23 mai 2021 à 15:50:15

                            Est-ce que tu passes qu'une fois ici, ou il y a une boucle qui fait que tu passes plusieurs fois ici ?

                            Est-ce que tu peux mettre tout ton code ? J'ai testé et j'ai bien une string.

                            S'il y a une boucle qui fait que tu executes plusieurs fois la requête avec des paramètres différents, il ce pourrait qu'a un moment dans cette boucle $txt soit null mais si tu fais un print_r();die; tu ne verras que la première itération.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            $2b||!$2b
                              24 mai 2021 à 17:18:14

                              Le code a ce jour. avec ça OUT affiche ARRAY.

                              // extraction de tous les publications contenant des photos
                              $tablo = mysql_query("SELECT post_text FROM phpbb_posts WHERE post_text LIKE '%cph%'");
                              $mask = '![0-9]+\.(?:jpeg|jpg|png|JPG)!';
                              
                              //test sur la 1ère ligne du tablo pour le moment
                              $row = mysql_fetch_row($tablo);
                              $txt = $row[0];
                              //en cas de test
                              //var_dump($txt);die; preg_match($mask,$txt,$out);
                              //en cas de test
                              //var_dump($out);die;
                              echo $out;



                              -
                              Edité par Xaxa Bibi 24 mai 2021 à 17:21:46

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Forza GT

                                24 mai 2021 à 18:00:54

                                Ta page PHP ne contient que ce code, rien d'autre ? Il n'y a que 8 ligne dans ton fichier ?

                                PS: <br> dans ton code devrait faire une erreur car pas du PHP et PHP n'interprète pas par magie le HTML xD

                                • Partager sur Facebook
                                • Partager sur Twitter
                                $2b||!$2b
                                  14 juillet 2021 à 18:10:16

                                  @skuti : mauvais copier-collé semble-t-il. je redonne le code complet :

                                  <?php
                                  //ACCES A LA BASE
                                  $bddserver = "serveur";
                                  $bddlogin = "log";
                                  $bddpassword = "mdp";
                                  $bdd = "mabase";
                                  $liendb = mysql_connect($bddserver, $bddlogin, $bddpassword) or
                                  die("Impossible de se connecter : " . mysql_error());
                                  mysql_select_db ($bdd);
                                  
                                  //sélection dans un tableau des posts avec des photos en format cph123456789
                                  $tablo = mysql_query("SELECT post_text FROM phpbb_posts WHERE post_text LIKE '%cph%'");
                                  $mask = '![0-9]+\.(?:jpeg|jpg|png|JPG)!';
                                  
                                  //POUR LINSTANT, test uniquement sur la 1ère ligne du tablo
                                  $row = mysql_fetch_row($tablo);
                                  $txt = $row[0];
                                  preg_match($mask,$txt,$out);
                                  
                                  echo $out;
                                  
                                  mysql_close();
                                  mysql_free_result($tablo);
                                  
                                  ?>
                                  
                                  



                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Forza GT

                                  Lire le tableau généré par un preg_match_all

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown