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 :

Remplacement d'une chaine entre { } par une valeur [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut Remplacement d'une chaine entre { } par une valeur
    Salut
    j'ai la chaine de caractere suivante
    $str = "<a href="show_profil.php?id={id}"><img src="{src}" alt="Votre image" /></a>"

    Le but est de remplacer chaque proprieté contenu
    entre les deux crochets { } par les valeurs correspendantes dans ce tableaux associatifs basics (pour l'exemple)

    $array = array("id"=>1,"src"=>"img.gif") ;

    Avez vous une idée

    Cordialement ,Ahmed

  2. #2
    Membre averti Avatar de nicocsgamer
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 321
    Points : 342
    Points
    342

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 52
    Points : 58
    Points
    58
    Par défaut
    Salut,

    je conseillerais plutôt preg_replace dans ce cas, car il est plus facile à appréhender grâce à l'utilisation de tableaux.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $str = "<a href="show_profil.php?id={id}"><img src="{src}" alt="Votre image" /></a>";
    $aCorresp = array("/\{id\}/"=>1,"/\{src\}/"=>"img.gif") ;
    $aFrom = array_keys($aCorresp);
    $aTo = array_values($aCorresp);     // facultatif, je pense
    echo preg_replace($aFrom, $aTo, $str);
    Stf

  4. #4
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Bonjour et merci à vos réponses
    le probleme c'est que je suis totalement novice dans les expressions régulieres ;
    en effet id et src se sont que des exemples ;

    Si le tableau contient tous les nom de colonne dans ma table ?,en plus c'est une methode qui va gerer ce tableau donc

    array("/\{id\}/"=>1,"/\{src\}/"=>"img.gif")
    il sera difficille à gerer non ?
    j'ai essayé avec une autre solution sans les expressions réguliere mais j'ai toujours besoin de boucles qui vont diminuer les performance de mon script
    à ++

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il y a plusieurs façons d'écrire la chose, dont l'utilisation de preg_replace_callback qui vous permettrait de ne traiter la chaîne qu'une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    function my_replace($string, $array) {
        return preg_replace_callback('~\{(.+)\}~U', create_function('$m', 'return isset($GLOBALS["' . $array . '"][$m[1]]) ? $GLOBALS["' . $array . '"][$m[1]] : $m[0];'), $string);
    }
     
    $str = '<a href="show_profil.php?id={id}"><img src="{src}" alt="Votre image" /></a>';
    $correspondances = array('id' => 1, 'src' => 'http://www.developpez.com/');
    echo my_replace($str, 'correspondances');

  6. #6
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut Malgrès que j'ai presque rien compris
    Malgrès que j'ai presque rien compris
    et en particulier

    create_function('$m', 'return isset($GLOBALS["' . $array . '"][$m[1]]) ? $GLOBALS["' . $array . '"][$m[1]] : $m[0];')
    franchement elle est super cette source elle m'a permis d'optimiser mon code
    Vraiment Merci

  7. #7
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Est ce que vous pouvez m'expliquer un peut ce bout de code ?
    Enfin j'arrive pas a l'utiliser dans une classe
    a +

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Sans votre code, nous ne sommes pas réellement en mesure de vous aider. Ça pourrait très bien être lié à un problème de portée.

    Alors comment ça fonctionne ? J'ai utilisé create_function pour créer une fonction anonyme et pour éviter d'en créer une nouvelle à part, requise par preg_replace_callback. D'autant plus que des problèmes par rapport aux paramètres ce serait posé : on aurait plus accès au tableau (celui qui associe vos noms à leurs valeurs de remplacement).

    J'ai fait attention aux problèmes de portée car votre tableau n'aurait pas été accessible à la fonction de rappel c'est pourquoi, ici, je lui fournis le nom de la variable en paramètre (et non la variable elle-même) à laquelle on peut accéder via $GLOBALS['nom_du_tableau'] depuis la fonction.

    Ce sera sans doute plus clair dans la documentation de PHP : Portée des variables Le restant du code PHP étant tout ce qu'il y a de plus banal : si le paramètre n'existe pas on le laisse intact (on retourne la valeur $m[0], qui représente l'ensemble de la chaîne correspondant au motif) sinon on retourne la valeur que vous avez prédéfini dans le tableau afin de la substituer.

  9. #9
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Merci pour l'explication ;
    Voila un peut l'alure de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class test{
    private function setContent(){		
     
    /////*du code*//////
     
    //$key3 c'set le string à appliquer la fonction
    //$rowOfFields c'est le tableau associatif 
     
    $TD .= .sprintf("<td>%s</td>",$this->my_replace($key3,$rowOfFields));
     
    /////*du code*//////
     
    }
     
    private function my_replace($string, $array)	{return preg_replace_callback('~\{(.+)\}~U', create_function('$m', 'return isset($GLOBALS["' . $array . '"][$m[1]]) ? $GLOBALS["' . $array . '"][$m[1]] : $m[0];'), $string);
     
    }	
    }
    en effet j'ai toujours $m[0], la chaîne correspondant au motif au lieu de sa valeur dans le tableaux associatif
    a ++

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonsoir,
    la version sans REGEX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
     
      $str = '<a href="show_profil.php?id={id}"><img src="{src}" alt="Votre image" /></a>';
     
      $tab = array('{id}' => 1, '{src}' => 'img.gif');
     
      echo str_replace(array_keys($tab), $tab, $str);
     
    ?>
    Je ne sais pas si c'est mieux ou plus rapide, c'était juste dans un coin de ma tête.

    Cordialement,
    DaRiaN.

  11. #11
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Il n'existe pas des crochets dans les clés du tableaux
    ils sont generés directement par mysql_fetch_assoc()
    (elle sont seulement dans la chaine à traiter)

    Cordialement

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT concat('{', `id`, '}') FROM `votre_table`;
    Ou directement par PHP, si vous utilisez la valeur `id` pour d'autres choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($tab as $cle => $val) $tab[$cle] = '{'.$val.'}';
    Mais si on commence à faire des boucles avec PHP, les REGEX finissent par être plus rapide, enfin, de toute façon, ce n'était qu'une simple information. Après, c'est à vous de déterminer quel code est le plus adéquate.

  13. #13
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Bon puisque j'arrive pas à regler le probleme de porté des variables ;ton astuce à l'air de me dépaner ,
    Salut et ++

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Etant donné le contexte objet, je pense que cette approche sera moins problématique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function my_replace($string, $correspondances) {
        return preg_replace('$\{(' . implode('|', array_map('preg_quote', array_keys($correspondances))) . ')\}$e', '$correspondances["\1"]', $string);
    }
     
    $str = '<a href="show_profil.php?id={id}"><img src="{src}" alt="Votre image" /></a>';
    $correspondances = array('id' => 1, 'src' => 'http://www.developpez.com/');
    echo my_replace($str, $correspondances);

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

Discussions similaires

  1. [XL-2007] Récupérer la position d'une sheet commencant par une chaine de caractères connue
    Par assiec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/12/2011, 09h44
  2. Réponses: 4
    Dernier message: 25/08/2011, 08h27
  3. Modifier un text par une variable entrée par l'utilisateur
    Par Plumdecul dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 04/08/2011, 18h32
  4. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  5. Réponses: 2
    Dernier message: 06/03/2009, 08h32

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