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 :

preg_replace : agir sur les variables de capture


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut preg_replace : agir sur les variables de capture
    Bonjour,

    J'ai un problème avec preg_replace, l'instruction suivante ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = preg_replace('#{\$([a-z]+)}#', $this->vars['$1'], $result);
    J'aimerais remplacer la valeur trouvée par la valeur qui est stockée dans le tableau $vars...

    Ma syntaxe est-elle fausse ?

    Merci d'avance

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    ne met pas de quote dans $1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result = preg_replace('#{\$([a-z]+)}#', $this->vars[$1], $result);

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    le souci est que t'as pas accès directement à $1, apparemment tu peux faire ça avec eval() : http://www.developpez.net/forums/d31...-preg_replace/ ou ça doit être faisable avec preg_replace_callback() sinon je pense pas que ce soit possible directement.

  4. #4
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    ne met pas de quote dans $1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result = preg_replace('#{\$([a-z]+)}#', $this->vars[$1], $result);
    Déjà test, ça ne fonctionne pas

    @Djakisback: je n'ai pas trop compris la fonction preg_replace_callback()...

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    peut tu faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    var_dump($this->vars)

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Il faudrait utiliser une variable dynamique mais je crois que $1 n'existe pas vraiment en tant que variable donc est inutilisable. Une soluce avec callback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $vars['a'] = "[new a]";
    $vars['b'] = "[new b]";
    $vars['c'] = "[new c]";
    $result = 'df{$b}gd{$a}dfg{$a}df';
    $result = preg_replace_callback('`{\$([a-z]+)}`', 'callback', $result);
    function callback($matches)	{
    	global $vars; 
    	return $vars[$matches[1]];
    }
     
    echo $result."<br>";

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Le preg_replace accepte sans problème ni complication inutile \\1 et $1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = preg_replace('#{\$([a-z]+)}#', '$1', $result);
    cf le premier exemple de http://us.php.net/manual/fr/function.preg-replace.php.

  8. #8
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Il faudrait utiliser une variable dynamique mais je crois que $1 n'existe pas vraiment en tant que variable donc est inutilisable. Une soluce avec callback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $vars['a'] = "[new a]";
    $vars['b'] = "[new b]";
    $vars['c'] = "[new c]";
    $result = 'df{$b}gd{$a}dfg{$a}df';
    $result = preg_replace_callback('`{\$([a-z]+)}`', 'callback', $result);
    function callback($matches)	{
    	global $vars; 
    	return $vars[$matches[1]];
    }
     
    echo $result."<br>";
    Ta soluce fonctionne, merci beaucoup

    Merci beaucoup

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Même si je ne suis lié en rien à l'origine de ce topic, je voulais vous remercier pour la solution qui met fin à 4h de prise de tête...

    Merci

Discussions similaires

  1. [TP] Question sur les variables
    Par argon dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 16/02/2006, 07h27
  2. Réponses: 3
    Dernier message: 22/12/2005, 00h40
  3. [RegEx] preg_replace : explications sur les caractères spéciaux
    Par Anduriel dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2005, 21h35
  4. [JVM] interactions jvm - code : agir sur les paramètres ?
    Par pierre.zelb dans le forum Général Java
    Réponses: 6
    Dernier message: 07/07/2005, 13h02
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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