Partage
  • Partager sur Facebook
  • Partager sur Twitter

PHP - Regex : utiliser $1 comme clé d'array

Sujet résolu
    19 mars 2019 à 10:55:44

    Bonjour à tous,

    je sèche depuis un moment sur la syntaxe d'une Regex. Plutôt qu'un discours, voici le cas (simplifié à l'extrême).

    $text = preg_replace('#image([0-9]{2})#', $images[.'$1'.], $text);

    ce qui me donne : Parse error: expecting `']'' in....

    vous l'avez compris, je veux utiliser l'élément $1 comme clé (01, 02, 03...) pour l'array $images dans une formulation simple.

    des tests semblent montrer que $1 adopte le comportement d'une chaîne de caractères ('01') et non d'un nombre (01).

    bien sûr, je sais faire cela dans une boucle for, mais intellectuellement, je trouve beaucoup plus ''méritant'' de faire en 1 ligne ce qu'une boucle fait en +++

    si un passionné peut m'aider, merci d'avance.

    salut à toute la communauté

    mhorv

    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2019 à 11:01:40

      Bonjour,

      la concaténation c'est entre des chaines de caractère.

      Hors la, tu essaye de faire je ne sais pas quoi.

      Tu mets les opérateurs de concaténation une fonction/variable avec le contenu de ta variable.

      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2019 à 11:06:42

        Bonjour,

        Pourquoi ne pas faire $images[$1] ?

        • Partager sur Facebook
        • Partager sur Twitter

        Call me Spaceman

          19 mars 2019 à 11:15:06

          merci de vos réponses rapides

          $images[$1] ne fonctionne pas : parse error, expecting `T_VARIABLE' or `'$'' in.....

          j'ai essayé

          $images[intval('$1')]

          pour transformer la string en INT, mais cela fige $1 à 01 (dans la fonction intval, car par ailleurs $1 conserve sa valeur réelle)

          Matioso tu as raison, l'idée de concaténer n'était pas la plus inspirée, c'est pourquoi j'ai testé inval qui semblait fonctionner, mais fige la valeur

          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2019 à 11:18:35

            Un nom de variable ne peut pas commencer a un nombre
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2019 à 11:26:32

              mes images se nomment image01.jpg, image02.gif, image03.png....

              ne connaissant pas les suffixes par avance, je laisse le script s'occuper de reconstituer le nom des fichiers

              je n'apporte que le numéro de l'image, soit 01, 02, 03....

              dans mon texte courant je repère les mots clés "image01", "image02"...; et j'essaye de les mouliner pour obtenir imageKEY.EXTENSION

              l'array des fichiers est $images[] ; donc la variable de chaque cas se nomme $images[KEY]

              comme je l'ai dit, je sais faire avec une boucle, mais c'est très moche

              • Partager sur Facebook
              • Partager sur Twitter
                19 mars 2019 à 11:36:51

                peux tu faire un var_dump de $images et nous montrer le résultat stp ?

                J'ai pas bien compris ton explication, donc je pense que j'y verrais plus clair avec le résulat du var_dump

                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2019 à 11:41:24

                  Oui, nous avons du mal à comprendre ce que tu as et ce que tu veux au final. Présente nous d'avantage le contexte, je pense que ça pourrait aider.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Call me Spaceman

                    19 mars 2019 à 11:45:02

                    voici-voilà

                    array(9) { [0]=> string(17) "1701231441_01.jpg" [1]=> string(17) "1701231441_02.jpg" [2]=> string(17) "1701231441_03.jpg" [3]=> string(17) "1701231441_04.jpg" [4]=> string(17) "1701231441_05.jpg" [5]=> string(17) "1701231441_06.jpg" [6]=> string(17) "1701231441_07.jpg" [7]=> string(17) "1701231441_08.jpg" [8]=> string(17) "1701231441_09.jpg" }

                    dans ce dossier, les extensions sont toutes .jpg, mais ce n'est pas le cas dans tous mes dossiers d'images

                    tu as compris, j'avais simplifié le nom des fichiers : "image" est une représentation : dans ce dossier, les fichiers se nomment "1701231441_??.EXTENSION"

                    dans d'autres dossiers ils se nomment autrement

                    -
                    Edité par Migorvil 19 mars 2019 à 11:46:16

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mars 2019 à 11:50:15

                      C'est preg_replace_callback que tu dois utiliser, tu ne peux pas mettre du code PHP comme ça.

                      Type :

                      $out = preg_replace_callback('#image(\d{2})#', function ($m) use($images) {
                          return $images[$m[1]];
                      }, $text);
                      

                      -
                      Edité par julp 19 mars 2019 à 11:52:06

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mars 2019 à 12:18:45

                        merci julp

                        1 an de php intensif, mais jamais utilisé les fonctions car a priori très hermétique à cette gymnastique ;-)

                        mais comme tu as pris la peine de m'aider, je vais tester reg_replace_callback avec l'aide du phpmanual

                        ça risque de chauffer sous la coiffe ; mais mon premier regard au sujet semble montrer que la boucle for est moins "codavore"

                        dommage car j'arrive à un résultat avec preg_replace et intval (voir plus haut), mais cela fige $1 à la première valeur rencontrée (01) quand $1 est integer, alors que $1 conserve la bonne valeur quand il est string... bizarre

                        NeoSensEight : je ne sais pas quoi ajouter comme explication à mon premier post : je cherche à remplacer dans un texte des mots clés par des balises d'affichage. Le mot clé me fournit la KEY des valeurs d'un tableau contenant les fichiers à afficher

                        voici mon premier script qui fonctionnait, mais imposait l'EXTENSION en dur

                        $text = preg_replace('#image([0-9]{2})#', substr($images[0],0, 10).'_$1.jpg', $text);

                        les fichiers ayant tous le même début de nom codé sur 10 chiffres (ex: 1701231441_01.jpg - - voir post plus haut : var_dump), j'appelais $1 pour incrémenter le fichier et ajoutais une extension en dur ; c'est moche et pas souple pour d'autres types d'extensions (gif, png...)

                        d'où l'idée d'appeler le fichier directement en passant $1 comme clé du tableau

                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 mars 2019 à 15:31:33

                          Bonjour à tous,

                          je n'ai pas réussi à faire exactement comme je le souhaitais, aussi je me suis rabattu sur la moche boucle for

                          JULP, j'ai jeté l'éponge avec les fonctions, pas que j'ai pas réussi, mais parce que l'écriture du code ne me fait rien gagner par rapport à la boucle, alors tant qu'à faire, je préfère utiliser une technique que je maîtrise instinctivement

                          encore merci pour l'aide apportée

                          • Partager sur Facebook
                          • Partager sur Twitter

                          PHP - Regex : utiliser $1 comme clé d'array

                          × 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