OVH Cloud OVH Cloud

Interpolation du contenu d'une variable

14 réponses
Avatar
jibux
Bonjour

Voici un petit prg qui résume mon pb d'interpolation :

$str='Je veux le contenu de "$toto"';
$toto=" cette variable est définie après celle qui y fait référence";
print($str);

Comment dire à php de parser le contenu de $str afin d'obtenir ce résultat :

Je veux le contenu de "cette variable est définie après celle qui y fait
référence"

Mes différentes recherches n'ayant pas abouties, je soumets ce problème à
votre sagacité.
--
jeb
http://jebissey.free.fr

4 réponses

1 2
Avatar
Guillaume Bouchard
jibux wrote:
Bonsoir Guillaume,


Bonsoir.

En simplifiant un petit peu, on créé un objet en lui indiquant :
- une requête SQL
- un format d'affichage faisant référence aux champs de la requête (d'où mon
pb de réf.)


En clair tu est un peu en train de reinventer la fonction vsprintf ?

vsprintf('SELECT %s FROM %s',array('champs','table'));

Tient, ce qui est dommage c'est que celle-ci ne permet pas de donner des
noms aux zones à remplacer.

Bon, qu'a cela ne tienne, un petit peu de codage et l'on obtiendra
quelque chose de bien plus sympa AMHA :

(Faites fatigué à 2 (déjà !!) heures du matin, surement améliorable)

function vsprintf_p($str,$array){
$masque = '`%(([a-z]+))(.*?[%bcdeufFosxX])`';
preg_match_all($masque,$str,$matchs,PREG_SET_ORDER);
$str = preg_replace($masque,'%$2',$str);
$replace = array();
foreach($matchs as $match){
$replace[] = $array[$match[1]];
}
return vsprintf($str,$replace);
}

Cela s'utilise avec

echo vsprintf_p('chaine de formatage qui suis les directives de printf
sauf que le % est suivit d'un nom entre parentheses',array('nom' =>
valeur));

<?php
print vsprintf_p("[%(value)10.10s]n", array('value' => 'monkay'));
print vsprintf_p("%(year)04d-%(month)02d-%(day)02d", array('year' =>
2005,'month' => 6,'day' => 6));
echo vsprintf_p("%(number).3e", array('number' => 350556445645465));
?>

Alors là on va dire que je me fatigue pour rien, que la méthode avec
eval est bien mieux.

Oui et non :

1) Eval de base c'est moche.
2) La fonction vsprintf_p peut être utilisée dans bien d'autres cas.
3) C'est quand même super estetique.

Bref voila.

--
Guillaume.

Avatar
jibux
Guillaume Bouchard wrote:

jibux wrote:
Bonsoir Guillaume,


Bonsoir.

En simplifiant un petit peu, on créé un objet en lui indiquant :
- une requête SQL
- un format d'affichage faisant référence aux champs de la requête (d'où
mon pb de réf.)


En clair tu est un peu en train de reinventer la fonction vsprintf ?

vsprintf('SELECT %s FROM %s',array('champs','table'));

Non je ne pense pas. Il faut dire que je n'ai pas donné beaucoup de

précisions.

En fait (toujours en simplifiant) j'ai :

$format="<table><tr><td>V(1)</td></tr></table>";
Après transformation avec preg_replace() on obtient :
$format="<table><tr><td>$f1</td></tr></table>";

avec $f1 qui contient la valeur du champ 1 de l'enregistrement courant.
Donc
eval("print("$format");");
affiche correctement le contenu de $f1 et respectant le format d'affichage
défini par le programme appelant.

J'ai pas analysé ta prose en détail, mais tu as fait ressurgir de ma mémoire
des vieux souvenirs en C avec la vsprintf() ...
Je vais étudier en détail vsprintf_p() qui semble être très puissante.

Merci pour cette réponse très détaillée.
--
jeb
http://jebissey.free.fr


Avatar
John GALLET
eval("print("$str");");


Attention à eval(), danger :

$str="system('rm -rf /');";

Bien nettoyer si $str peut venir du monde extérieur.

a++;
JG

Avatar
jibux
John GALLET wrote:

eval("print("$str");");


Attention à eval(), danger :

$str="system('rm -rf /');";

Bien nettoyer si $str peut venir du monde extérieur.



En fait c'est moi qui défini $str en faisant appel à mon générateur de
formulaires. Donc pas de danger. Mais ce rappel n'est pas inutile tant il
est vrai qu'on ne pense pas toujours à tous les effets de bord possibles
des différentes fonctions utilisées dans nos programmes.

--
jeb
http://jebissey.free.fr


1 2