Page 1 sur 1

utiliser une variable variable (dynamique) dans preg_replace

Posté : 17 janv. 2007, 23:41
par thibs44
euh déjà salut tout le monde.

je poste car je suis vraiment bloqué sur un truc et je ne trouve désespérement pas de réponse.


je voudrais utiliser les variables dynamqiue dans un preg replace, un petit exemple:
$remplacer = 'mon changement';
preg_replace ('ceci est remplacer', '$$1', $remplacer );
je voudrais que ca donne
>> ceci est mon changement

sauf que $$1 marche pas, ${$1}, $\\1 non plus. comment faire?

merci d'avance!

Re: utiliser une variable variable (dynamique) dans preg_rep

Posté : 17 janv. 2007, 23:44
par Hubert Roksor
Est-ce que ce serait possible d'avoir un vrai exemple stp ? C'est-à-dire le code que tu utilises vraiment, celui-ci est bourré d'erreurs sans rapport avec ton problème.

Posté : 18 janv. 2007, 00:01
par thibs44
hum c'est assez compliqué à expliquer.

j'ai à la base un fichier XML qui me sert à plusieurs trucs, l'un d'entre eux est de formatter ce fichier en HTML pour l'envoyer par e-mail. je le parse avec simplexml

le truc c'est que des parties de ce fichier XML doivent etre modifiées à travers ce "parseur". si dans le fichier XML j'ai [$ma_variable] je voudrais que cela soit remplacé par ma variable $ma_variable

donc le XML de lettre.xml:

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <mail titre="lettre d'information du [$date]">
là je voudrais remplacer [$date] par une variable, $date, qui contient ce que je veux
<?php
$xml  = simplexml_load_file('lettre.xml');
$date = date(r);

echo '<html>
<body><h1>'.preg_replace('!\[\$(.+)\]!isU',XXX, $xml["titre"]).'</h1>
</body>
</html>'
?>
ce qui me manque c'est donc la partie XXX, pour obtenir au final

Code : Tout sélectionner

<html> <body><h1>lettre d'information du Wed, 17 Jan 2007 12:34:56 +0200</h1> </body> </html>
j'espère avoir été assez clair

Posté : 18 janv. 2007, 00:13
par Hubert Roksor
Erm, je vois. Il te faut utiliser preg_replace_callback(), mais l'inconvénient c'est que tes variables n'appartiendront pas au bon "scope" (autrement dit, $date n'est pas défini à l'intérieur d'une autre fonction). D'un autre côté, si la seule variable est $date alors tu peux replacer ta regex par quelque chose de beaucoup plus simple comme
preg_replace('!\\[\\$date\\]!isU', date('r'), $xml["titre"]);
Tu peux aussi utiliser le modifier e mais c'est potentiellement un gros risque au niveau de la sécurité. À n'utiliser que si tu contrôles 100% du contenu du fichier XML
preg_replace('!\\[\\$([a-z_0-9]+)\\]!isUe', '$$1', $xml["titre"]);
...où $1 sera remplacé par le nom de la variable, ce qui donnera donc $date qui sera ensuite évalué par PHP pour donner la date.

Sinon, tu peux aussi t'intéresser à XSLT, dès qu'on comprend comment ça marche ça rend de grands services.

Posté : 18 janv. 2007, 00:34
par thibs44
waow merci beaucoup, c'est ce isUe qui me manquait.

XSLT c'est surement cool je te l'accorde mais c'est exécuté coté navigateur je crois, que se passe-t-il lorsque l'on veut ouvrir ce genre de message dans hotmail par exemple?

bref merci beaucoup pour la réponse!

Posté : 18 janv. 2007, 01:28
par Hubert Roksor
Le "T" de XSLT signifie Transformation, c'est un langage qui permet de transformer du XML en HTML (ou du XML en XML, mais c'est une autre histoire). Soit tu le fais du côté du navigateur, soit tu le fais en PHP, auquel cas le résultat est une page HTML "toute bête". Par exemple, cette page aurait pu être généré par du XSLT et tu ne le saurais même pas ! :)