IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Remplacer des variables dans une chaine


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut [Tableaux] Remplacer des variables dans une chaine
    Bonjour,

    Je cherche à remplacer des noms de variable, dans une chaine, par leur valeur.

    Je crée un tableau de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data = array('M. X', '100', '03/04/07');
    Je récupère le contenu d'un fichier texte qui contient des variables php (correpondant au tableau en fait)
    Exemple de contenu du fichier texte :
    Bonjour $data[0],
    Vous avez $data[1] points actuellement.
    Le prochain RDV sera le $data[3].
    A bientôt.
    Je récupère sans problème le contenu dans une variable ($Chaine).

    Ce que je voudrais faire, c'est remplacer les noms de variable dans la chaine par leurs valeurs issues du tableau.

    Je l'ai lu quelque part mais impossible de le retrouver.

    J'ai bien une solution avec eval() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval('$Chaine = "' . $Chaine . '";');
    Mais cela n'est pas satisfaisant d'un point de vue de la sécurité d'autant que c'est l'utilisateur qui rédigera le fichier texte.

    Auriez-vous d'autres solution ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 87
    Par défaut
    Bonsoir,
    la meilleur solution, mais un peu différente, et la plus rapide est probablement celle employée par les moteurs de template. Elle consiste à utiliser "include". En revanche, elle nécessite de modifier ton fichier texte:
    Bonjour <?php echo $data[0] ?>,
    Vous avez <?php echo $data[1] ?> points actuellement.
    Le prochain RDV sera le <?php echo $data[2] ?>.
    A bientôt.
    Puis dans le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $data = array(...);
    ob_start();
    include('monfichier');
    $Chaine = ob_get_flush();
     
    echo $Chaine;
    Ainsi tu peux même utiliser des fonctions...

    Sinon eval doit être une bonne solution ou créer un mini parser. Une fois que tu auras récupérer les noms des variables tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    str_replace($nomDeMaVariable, $$nomDeMaVariable);
    enfin c'est une idée ^^

  3. #3
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Bonsoir,

    Je ne peux pas utiliser ta première solution car la saisie des variables dans le fichier texte doit être simplifiée au maximum pour l'utilisateur.
    Inclure les balises de php alourdit la syntaxe et va forcement générer des erreurs. De plus, cela ne résoud pas les pb de sécurité de eval.

    Par contre, la 2eme solution me semble intéressante. j'ai déjà le nom des variables (elles s'appellent toutes $data puisque c'est un tableau)

    J'ai donc écrit ceci qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for($i = 0; $i < count($data); $i++)
          $Chaine = str_replace('$data[' . $i . ']', $data[$i], $Chaine);
    Là, effectivement, je n'ai plus de soucis de sécurité puisque je maitrise le tableau de données, donc pas de risque d'executer du code php qui se trouverait dans le fichier.

    Mais comme je suis un perfectionniste, l'idéal serait, plutot qu'une boucle, d'utiliser une expression régulière avec "preg_replace".

    J'ai essayé mais comme les RegExp ne sont pas ma spécialité, autant j'ai réussi à créer le pattern, autant je n'ai pas trouvé la syntaxe de la chaine de remplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Chaine = preg_replace('`(\$data\[[0-9]+\])`', 'xxx', $Chaine);
    Voilà où j'en suis...

  4. #4
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Ca y est, j'ai trouvé !



    La solution se trouve dans une des options de preg_replace (il n'y a que cette fonction qui s'en sert) :
    e

    Avec cette option, preg_replace effectue la
    substitution normale des références arrières dans la
    chaîne de remplacement, puis l'évalue comme un code PHP, et
    utilise le résultat pour remplacer la chaîne de recherche.
    Les simples et doubles quotes sont échappées avec des anti-slashes
    ( \ ) dans les références arrières substituées.
    Exemple dans preg_replace :
    Utilisation de l'option 'e'


    <?php
    preg_replace("/(<\/?)(\w+)([^>]*>)/e",
    "'\\1'.strtoupper('\\2').'\\3'",
    $html_body);
    ?>
    Il suffisait ensuite de trouver la bonne syntaxe pour mon cas particulier. Après quelques essais infructueux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Chaine = preg_replace('`\$data\[([0-9]+)\]`e', '$data[\'$1\']', $Chaine);
    Et c'est nickel ! Une seule ligne de code, pas de risque de sécurité et un remplacement assuré et rapide quelque soit le nombre de variables.



    Merci pour l'idée du str_replace qui m'a guidé vers la lumière (ou, du moins, vers la solution)


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer des caractères dans une chaine interbase 7.5
    Par zaydoun_391 dans le forum InterBase
    Réponses: 1
    Dernier message: 15/04/2008, 16h57
  2. Remplacer des carractères dans une chaine
    Par Superzobi dans le forum C++
    Réponses: 23
    Dernier message: 02/05/2007, 16h35
  3. Réponses: 2
    Dernier message: 06/02/2007, 22h48
  4. [Tableaux] Supprimer des caractères dans une chaine
    Par ddubois dans le forum Langage
    Réponses: 10
    Dernier message: 16/12/2006, 13h53
  5. Réponses: 4
    Dernier message: 29/08/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo