Partage
  • Partager sur Facebook
  • Partager sur Twitter

preg_match_all() qui me rend dingue

pourquoi là ca marche et pas içi ?!!

Sujet résolu
    6 avril 2007 à 19:59:58

    Salut,

    je m'adresse en particulier à tous les adeptes des expressions régulières.
    Il se trouve que j'ai un problème avec celles-ci et plus particulièrement avec la fonction preg_match_all()

    Je voudrais m'en servir pour une image dynamique qui affichera les 2 dernières news d'une page internet PHP (on récupèrera la source HTML grâce à file_get_contents() )

    Ma démarche



    Ne tenez compte que des commentaires en Français ^^

    <?php

    // Information about source code
    $Url = 'http://www.gamesmajor.com/portal.php';
    $regex = '`<span class="smallheadlinetext" style="line-height:150%">([0-9]{2}/[0-9]{2}/[0-9]{4})<br />
    <span style="font-weight: bold">(.*)</span><br />`isU'
    ;

    // Get last Gamesmajor' news
    $source = file_get_contents($Url);

    // Searching last new into source code
    preg_match_all($regex,$source,$matches);

    /*
    $matches[1][0] contient normalement la date de la news (parenthèse 1 de la regex)
    $matches[2][0] contient normalement le titre de la news (parenthèse 2 de la regex)
    */


    // ----------------------------------------------

    // 'Constructing' image file
    Header('Content-Type: image/gif');
    $img = imagecreatefromgif('gamesmajor-sign.gif');
    $black = imagecolorallocate( $img , 0 , 0 , 0 );

    imagestring($img, 4, 10, 8, 'Last infos about Gamesmajor :', $black); // Title

    // 1st new
    imagestring($img, 2, 10, 23, $matches[1][0], $black); // Date
    imagestring($img, 2, 10, 33, $matches[2][0], $black); // Title

    // 2nd new
    imagestring($img, 2, 10, 50, $matches[1][1], $black); // Date
    imagestring($img, 2, 10, 60, $matches[2][1], $black); // Title


    // Generating image file
    imagegif( $img );

    ?>


    Voila donc ce code va dans un premier temps chercher les informations du dit site (ma regex est correcte, il n'y a pas de fautes. C'est bien une reproduction exacte des parties de la source que je veux récupèrer.) et dans un 2ème temps génère une image de type GIF.

    Mon problème



    Eh bien c'est tout simple, le tableau multidimentionnel $matches ne contient aucune valeurs >_<
    Lorsque j'ai envoyé ce fichier sur mon FTP et que je tente de générer la page, j'ai une jouli image ... vide ! o_O

    Je vous rassure, ce n'est pas une erreur du type "impossible de récupèrer la source" ou encore "mauvaise utilisation du preg_match_all", j'ai déjà essayé plein de trucs qui me prouvent que ce n'est pas ce genre d'erreurs.
    Par exemple :
    • La fonction preg_match_all() est activée chez mon hébergeur
    • J'ai fait un test simple avec preg_match_all() qui me confirme que la fonction fait correctement son travail. Le voiçi :
      $txt = 'test pour récuperer <test>toutes le</test>s expressions entre la balise TEST';
      $regex = '`<test>(.*)</test>`isU';
      preg_match_all($regex,$txt,$result);

      // $result[1][0] m'affiche bien "toutes le"

    Le plus marrant dans tout ça, tenez vous bien, c'est que ce code fonctionne lorsque je suis en LOCALHOST ! (j'utilise Wamp)
    Et oui, en LOCALHOST j'ai mon image avec les 2 dernières news bien au mileu de mon image, tout est parfait aucune erreurs !
    Mais dès que je passe le fichier sur un FTP c'est le noir total :(

    Voila je comprend vraiment pas pourquoi ca marche en LOCAL et pas sur un FTP.
    Ca me rend fou o_O

    Si vous avez la réponse ou ne serait-ce même qu'une idée, exposez moi votre point de vue :)

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      6 avril 2007 à 20:19:30

      Un print_r de $matches donne un array vide ?
      • Partager sur Facebook
      • Partager sur Twitter
        6 avril 2007 à 20:29:45

        Qu'entends-tu par image vide ?
        gamesmajor-sign.gif existe dans le meme dossier que ton script ?
        • Partager sur Facebook
        • Partager sur Twitter
          6 avril 2007 à 20:42:57

          Citation : RaSk

          Un print_r de $matches donne un array vide ?


          Oui, ca me donne ceci :
          Array
          (
              [0] => Array
                  (
                  )

              [1] => Array
                  (
                  )

              [2] => Array
                  (
                  )

          )


          Citation : Dentuk

          Qu'entends-tu par image vide ?
          gamesmajor-sign.gif existe dans le meme dossier que ton script ?



          Oui oui ca n'a rien à voir c'est l'image de fond sur laquelle est écrite les données récupérées par PHP. Mais comme PHP ne récupère rien, ca m'affiche juste mon image sans rien marqué dessus :(
          • Partager sur Facebook
          • Partager sur Twitter
            6 avril 2007 à 20:53:38

            Et avec error_reporting(E_ALL); en début de script, text/plain en content-type et sans le imagegif() ça donne quoi ?
            Edit : Et un echo sur le preg_match_all() et un var_dump sur le file_get_contents().
            • Partager sur Facebook
            • Partager sur Twitter
              6 avril 2007 à 21:08:03

              Avec le error_reporting(E_ALL); ca me donne ceci :

              Citation : PHP

              Notice: Undefined offset: 0 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 20

              Notice: Undefined offset: 0 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 20

              Warning: Cannot modify header information - headers already sent by (output started at /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php:16) in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 26

              Notice: Undefined offset: 0 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 34

              Notice: Undefined offset: 0 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 37

              Notice: Undefined offset: 0 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 38

              Notice: Undefined offset: 1 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 41

              Notice: Undefined offset: 1 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 44

              Notice: Undefined offset: 1 in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 45



              var_dump($source) me donne ca :

              Citation : PHP

              string(39675) "[LA SOURCE ENTIERE DU SITE]"



              et le echo preg_match_all(...); me donne ceci :

              Citation : PHP

              0
              Warning: Cannot modify header information - headers already sent by (output started at /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php:11) in /media/160go/hebergement/jeff52.goldzoneweb.info/others/sign.gif/index.php on line 21




              Note : je suis bien en Header('Content-Type: text/plain');
              • Partager sur Facebook
              • Partager sur Twitter
                6 avril 2007 à 21:34:46

                Donc preg_match_all trouve rien alors que le contenu est bien obtenu... o_O
                • Partager sur Facebook
                • Partager sur Twitter
                  6 avril 2007 à 21:41:36

                  Citation : Dentuk

                  ... o_O


                  Ca tu l'as dis :p

                  Je comprend absolument pas pourquoi o_O

                  Note : J'ai essayé avec différents hébergeurs (free, goldzoneweb, un serveur d'un ami ...) rien à faire, sur un FTP ca marche pas et en LOCAL tout fonctionne a merveille !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 avril 2007 à 22:25:17

                    Bon ... après pleins de test divers, de souffrances (qui malheureusement continuent :( ) j'ai pu rétrécir l'étau du problème.
                    Ce problème est que ma regex (que l'on utilisera pour chercher dans ma source) est sur deux lignes :

                    <?php
                    $regex='`<span class="smallheadlinetext"style="line-height:150%">([0-9]{2}/[0-9]{2}/[0-9]{4})<br />
                    <span style="font-weight: bold">
                    (.*)</span><br />`isU';
                    ?>


                    Tout fonctionne bien dans preg_match_all() jusqu'au moment où la regex arrive au retour à la ligne.
                    Vous l'avez deviné, ce retour à la ligne me chamboule tout et du coup, preg_match_all() ne trouve pas l'occurence dans la source du site.

                    Evidemment que j'ai essayé d'utiliser les classes abrègées : \n (nouvelle ligne), \r (retour de chariot) ... j'ai même essayé avec \t (tabulation) bien que cela soit incohérent (mais ca prouve que je suis paumé >_< )

                    ... Rien à faire !!!

                    Voila, des tests effectués m'ont prouvés que preg_match_all() fonctionnait normalement tant qu'il n'y avait pas de retour à la ligne dans la regex.

                    Ah et bien sûr, la touche finale est que bien évidemment tout fonctionne parfaitement en LOCALHOST (je tourne sous wamp avec une version PHP >= 5 , je me souvient plus de l'exacte version dont je dispose) mais sur un FTP, c'est fini ca marche plus !
                    Je rappelle que j'ai essayé sur différents serveurs (free.fr, goldzoneweb.info, le serveur d'un ami). La version de PHP installée sur ces serveurs n'a rien à voir avec mon problème.

                    Voila, c'était un petit up :D
                    Bison, si tu passes par ici est ce que tu as une idée ? (autant demander au meilleur "regexman" que je connaisse ^^ )
                    Si qqn a une petite idée ou opinion ... :euh:

                    Merci encore.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 avril 2007 à 22:29:40

                      Ah !
                      Et en remplaçant le retour à la ligne par \s* ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 avril 2007 à 12:05:40

                        Citation : Dentuk

                        Ah !
                        Et en remplaçant le retour à la ligne par \s* ?


                        ...
                        Secret (cliquez pour afficher)
                        ! Ca Marche ! Image utilisateurImage utilisateur

                        Et oui ... incompréhensible o_O mais ca fonctionne !
                        Merci beaucoup à toi
                        Image utilisateur

                        Problème résolu
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 avril 2007 à 13:31:09

                          Bah dans \r\n sous windows par exemple un retour à la ligne vaut deux caractères blancs (\r + \n).
                          Ca doit venir de là.
                          Sinon tu peux essayer avec \s{1,2} ça devrait marche aussi je pense.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          preg_match_all() qui me rend dingue

                          × 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