Discussion:
Interpréter le contenu d'une variable
(trop ancien pour répondre)
Denis Beauregard
2012-04-02 21:19:42 UTC
Permalink
Est-ce que quelqu'un pourrait m'aider? Voici mon problème...
$formatDeDate = '$jour $mois $annee';
$jour = "10";
$mois = "février";
$annee = "2012";
echo $formatDeDate;
10 février 2012
S.V.P., ne me dites pas de placer $formatDate="$jour $mois $annee"; juste avant echo. Je ne peux pas faire ça. Les noms de variable doivent OBLIGATOIREMENT être contenus dans un string et qui doit, lui, être interprété par la suite.
Je pense qu'il y a un petit problème ! Si la 1re ligne est interprétée
avant les 3 suivantes, on ne peut pas savoir quelles sont les valeurs
des variables et donc le résultat ne peut être celui espéré !

Une solution, mais je ne la trouve pas élégante :


global $jour, $mois, $annee;

function $formatDeDate () {
global $jour, $mois, $annee;
return $jour." ".$mois." ".$annee;
}
echo $formatDeDate ();


Denis
Etienne
2012-04-03 07:54:30 UTC
Permalink
Est-ce que quelqu'un pourrait m'aider? Voici mon problème...
$formatDeDate = '$jour $mois $annee';
$jour = "10";
$mois = "février";
$annee = "2012";
echo $formatDeDate;
10 février 2012
S.V.P., ne me dites pas de placer $formatDate="$jour $mois $annee"; juste avant echo. Je ne peux pas faire ça. Les noms de variable doivent OBLIGATOIREMENT être contenus dans un string et qui doit, lui, être interprété par la suite.
Regarde du coté de eval.
Ca devrait résoudre ton problème.

D'ailleurs il y a exactement ton besoin dans le premier exemple

<?php
$string = 'tasse';
$name = 'café';
$str = 'Ceci est une $string avec mon $name dedans.<br />';
echo $str;
eval( "\$str = \"$str\";" );
echo $str;
?>

Etienne.
Christophe Méresse
2012-04-03 09:13:20 UTC
Permalink
Est-ce que quelqu'un pourrait m'aider? Voici mon problème...
$formatDeDate = '$jour $mois $annee';
$jour = "10";
$mois = "février";
$annee = "2012";
echo $formatDeDate;
10 février 2012
S.V.P., ne me dites pas de placer $formatDate="$jour $mois $annee"; juste avant echo. Je ne peux pas faire ça. Les noms de variable doivent OBLIGATOIREMENT être contenus dans un string et qui doit, lui, être interprété par la suite.
Merci pour votre aide!
Stéphane
Avec preg_replace et le flag "e" (PREG_REPLACE_EVAL)

$pattern = '/(\$[a-z]+)/e';
$replacement = '${1}';
echo preg_replace($pattern, $replacement, $formatDeDate);

Améliorer le pattern si on veut des variable qui acceptent les
majuscules ou d'autres charactères...
On peut aussi utiliser la fonction eval. Attention à être bien certain
que les variables ne contiennent pas de code malicieux (si c'est toi
qui les gère il n'y a probablement pas de problème, si elles
proviennent par exemple de l'utilisateur c'est une autre histoire);
ceci dit, c'est le même problème avec le flag PREG_REPLACE_EVAL.

Christophe
Thomas Mlynarczyk
2012-04-03 09:25:08 UTC
Permalink
$formatDeDate = '$jour $mois $annee';
$jour = "10";
$mois = "février";
$annee = "2012";
echo $formatDeDate;
10 février 2012
function format( $format, array $data )
{
if ( !is_string( $format ) or !$data ) return $format;
foreach ( $data as $key => $value ) $tmp["{{$key}}"] = $value;
return strtr( $format, $tmp + array( '{{' => '{' ) );
}

$formatDeDate = '{jour} {mois} {annee}';
echo format( $formatDeDate, array( 'jour' => '10', 'mois' => 'février',
'annee' => '2012' ) );

Ou, s'il faut absolument utiliser la syntaxe '$jour $mois $annee':

function format( $format, array $data )
{
if ( !is_string( $format ) or !$data ) return $format;
foreach ( $data as $key => $value ) $tmp["\${$key}"] = $value;
return strtr( $format, $tmp + array( '$$' => '$' ) );
}

$formatDeDate = '$jour $mois $annee';
echo format( $formatDeDate, array( 'jour' => '10', 'mois' => 'février',
'annee' => '2012' ) );

Ou tout simplement:

$formatDeDate = '$jour $mois $annee';
echo strtr( $formatDeDate, array( '$jour' => '10', '$mois' => 'février',
'$annee' => '2012' ) );
--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)
Loading...