IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> remplacement de chaîne de caractère par des variables, preg_replace avec variable, pour php et ajax [1/2 résolu]
Options
toluol
posté 15 Oct 2015, 16:25
Message #1


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Hello,

afin d'éviter des répétitions au sein de mon code entre des éléments php et javascript...
je me demande si vous voyez une solution simple pour remplacer une chaine de caractère qui contient des petits éléments codés spécialement (genre bbcode ou plus simple) pour être remplacé par des variables du même nom.

par exemple, en php :
Code
$var1="rouge";
$var2="bleu";
$source="@var1@ et @var2@ sont des variables."; //@...@ marqueur à déterminer
echo SuperFonctionPhp($source); //result : "rouge et bleu sont des variables."


Vous me direz : "ben il suffit de remplacer @var1@ par $var1 directement dans $source". Bien-sûr, cela fonctionnerait en php, mais je cherche à avoir un $source unique pour une reprise du code en ajax (et le javascript ne forme pas ses variables avec un $).


Après un petit moment, en php, j'ai réussi à le faire ainsi :
Code
$var1="rouge";
$var2="bleu";
$vars=array("@var1@"=>$var1, "@var2@"=>$var2);
$source="@var1@ et @var2@ sont des variables.";

function transform($source,$vars){
    return (preg_replace_callback("/@(.*)@/U", function($match) use ($vars) {
    if(isset($vars[$match[0]])){ return ($vars[$match[0]]); }else{ return($match[0]); } },  $source));
}

echo transform($source,$vars); //result : "rouge et bleu sont des variables."


Mais je trouve cette solution "lourdingue", surtout qu'elle oblige à déclarer toutes les variables préalablement dans un tableau. (ligne 3 : $ vars = ...)
Au début, je voulais utiliser la forme de variable ${$nom}, mais celle-ci ne fonctionne apparemment pas au sein preg_replace. (ou bien, je n'ai pas réussi). C'est bien dommage:
Code
$var1="rouge";
$var2="bleu";
$source="@var1@ et @var2@ sont des variables";
echo preg_replace("/@(.*)@/U", ${$1}, $source);

.. m'indique l'erreur :
( ! ) Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '$' in /Users/seb/Sites/PRO/PRO/index.php on line 40

Voyez-vous une solution ? (y compris en javascript)
Merci d'avance pour toute contribution, idée, prière, sponsoring... rolleyes.gif biggrin.gif

Ce message a été modifié par toluol - 15 Oct 2015, 17:09.
Go to the top of the page
 
+Quote Post
Philippe64
posté 15 Oct 2015, 16:55
Message #2


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 263
Inscrit : 31 Aug 2002
Lieu : Saint-Jean-de-Luz
Membre no 3 355



comme ça : (j'ai un peu détaillé)
Code
$var1="rouge";
$var2="bleu";
$source='@var1@ et @var2@ sont des variables';
$source2 = preg_replace("/@(.*)@/U", '$$1', $source);

echo $source2;

echo "<br />";

eval( "\$source2 = \"$source2\";" );
echo $source2;


voir exemple ci dessous :
http://php.net/manual/fr/function.eval.php


--------------------
En activité : Macbook pro 15" Core I7 à 2.8Ghz de 2015 - Macbook pro 13" Core I5 à 2.5Ghz - Macbook pro 15" Core duo de 2006 qui marche toujours hyper bien - iPhone 6s - iPad - iPad Mini
En Panne : Imac 27 Pouces Core I7 à 3.4Ghz - mid 2011 (je cherche un écran)
A la retraite : Imac C2D 24 Pouces (blanc) à 2.33 Ghz - iBook14" 800 Mhz - Quicksilver 733 - G3 bleu et blanc - Macintosh Classic - iPhone 3G - iPhone 4s

Crea64 : creation de site internet à Saint-Jean-de-Luz (64)
Go to the top of the page
 
+Quote Post
toluol
posté 15 Oct 2015, 17:08
Message #3


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



wow... si simple ! Bravo et merci !

J'espère réussir la même chose pour le javascript... !

Go to the top of the page
 
+Quote Post
yponomeute
posté 15 Oct 2015, 17:47
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 969
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



La fonction vsprintf me parait adaptée à ton cas

Code
$var[1] = 'bleu';
$var[2] = 'rouge';

$source = '%1$s et %2$s sont des variables';

echo vsprintf($source, $var);


et avec la librairie php.js tu peux avoir la même fonction côté javascript : http://phpjs.org/functions/vsprintf/


--------------------
MBP 2017 15" avec clavier pourri et touchbar inutile
Go to the top of the page
 
+Quote Post
toluol
posté 15 Oct 2015, 17:59
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



arf, merci mais je cherche à avoir la même chaine de caractère en javascript qu'en php.

donc le début sera :

Code
var1="rouge";
var2="bleu";
source="@var1@ et @var2@ sont des variables."; //(récupéré de php)


et là, je peine sacrément... drill.gif
même ma regex ne fonctionne pas...
source = source.replace(/@([a-z0-9]+)@/i, "$1"); // ça ne prend pas toutes les instances???

Ce message a été modifié par toluol - 15 Oct 2015, 18:00.
Go to the top of the page
 
+Quote Post
toluol
posté 15 Oct 2015, 19:00
Message #6


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Citation (toluol @ 15 Oct 2015, 18:59) *
arf, merci mais je cherche à avoir la même chaine de caractère en javascript qu'en php.


@yponomeute : AH non, effectivement, je n'avais pas compris cette fonction, désolé ! (Je croyais que tu replaçais des variables dans la chaine de départ)
Oui, la fonction vsprintf comme tu l'as utilisée est très intéressante (car, encore moins de lignes sont écrites et la fonction est peut-être moins gourmande en ressource que les regex ?), par contre, pour garder une certaine lisibilité du code, il n'est pas possible de le faire en tableau associatif ?

$var['color1'] = 'bleu';
$var['color2'] = 'rouge';
$source = '%color1$s et %color2$s sont des couleurs variables';
echo vsprintf($source, $var);

--> Ici, cela ne fonctionne hélas pas.

Sinon, je vais voir du côté de phpjs... si la librairie n'est pas trop lourde, pourquoi pas !

EDIT:
vsprintf ne supporte apparemment pas cette notation. Le manuel php propose la fonction vnsprintf à cette fin, mais je doute, du coup, trouver la même fonctionnalité avec phpjs...

mhhh... les fonctions eval et preg_replace n'existant pas dans phpjs, me voilà dans une fâcheuse posture... ! ^^
Peut-être que vsprintf et phpjs sont les meilleurs couples pour faire ce que je veux, mais je trouve pénible de perdre en lisibilité avec des noms de variables sous forme de chiffres...

Ce message a été modifié par toluol - 15 Oct 2015, 18:53.
Go to the top of the page
 
+Quote Post
scoch
posté 19 Oct 2015, 16:00
Message #7


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 820
Inscrit : 1 Jul 2010
Membre no 156 073



Doublon à supprimer (le site était en train de tomber en rade quand j'ai posté).

Ce message a été modifié par scoch - 19 Oct 2015, 16:45.


--------------------
L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
Go to the top of the page
 
+Quote Post
scoch
posté 19 Oct 2015, 16:01
Message #8


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 820
Inscrit : 1 Jul 2010
Membre no 156 073



Doublon à supprimer (le site était en train de tomber en rade quand j'ai posté).

Ce message a été modifié par scoch - 19 Oct 2015, 16:42.


--------------------
L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
Go to the top of the page
 
+Quote Post
scoch
posté 19 Oct 2015, 16:07
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 820
Inscrit : 1 Jul 2010
Membre no 156 073



Doublon à supprimer (le site était en train de tomber en rade quand j'ai posté).

Ce message a été modifié par scoch - 19 Oct 2015, 16:42.


--------------------
L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
Go to the top of the page
 
+Quote Post
scoch
posté 19 Oct 2015, 16:07
Message #10


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 820
Inscrit : 1 Jul 2010
Membre no 156 073



Doublon à supprimer (le site était en train de tomber en rade quand j'ai posté).

Ce message a été modifié par scoch - 19 Oct 2015, 16:42.


--------------------
L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
Go to the top of the page
 
+Quote Post
scoch
posté 19 Oct 2015, 16:46
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 820
Inscrit : 1 Jul 2010
Membre no 156 073



Bonjour,

pour la partie JavaScript qui semble encore te poser problème tu peux éventuellement faire comme ça :

Code
// Les variables PHP reçues en AJAX
var variablesPHP = '$var1 = "bleu"; $var2 = "rouge";';
// Transformer la chaîne en code JS (les variables seront globales)
eval(variablesPHP);

// La source reçue en AJAX
var source = '@var1@ et @var2@ sont des variables.';
// Référencer dans le tableau "variables" tous les fragments de la chaîne encadrés par "@"            
var variables = source.match(/@([a-z0-9]+)@/g);
// Boucler sur le tableau des "variables"
for( var i in variables ) {
    // Modifier le fragment en supprimant les "@" et en ajoutant le préfixe "$"
    var variableTexte = '$'+variables[i].replace(/@/g, '');
    // Transformer cette chaîne en code JS avec eval()
    var variableCode = eval(variableTexte);
    // Dans une chaîne temporaire remplacer la "variable texte" de la source par la "variable code" (soit sa valeur)
    var s = source.replace(variables[i], variableCode);
    // Modifier la source
    source = s;
}

console.log(source);// bleu et rouge sont des variables.


--------------------
L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
Go to the top of the page
 
+Quote Post
toluol
posté 19 Oct 2015, 22:50
Message #12


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



ça m'a l'air intéressant tout ça...

Mais du coup, ça veut presque dire qu'on peu se passer des @....@ et faire directement une notation $variables dans ma chaine php ???
Je cherche à être le plus simple possible pour avoir une string (en fait une structure html) commune et unique à php et javascript.

Code
// EN PHP
$color1 = 'bleu';
$color2 = 'rouge';
$str = '$color1 et $color2 sont des variables.';
echo $str;  //$color1 et $color2 sont des variables.
eval( "\$str = \"$str\";" );
echo $str; //bleu et rouge sont des variables.


//EN JS : $str est ensuite transmis
var str = div_transmettant_ma_string.attr('str'); //$color1 et $color2 sont des variables.
var color1 = 'vert';
var color2 = 'jaune';
var variables = str.match(/$([a-z0-9]+)\s/g);
for( var i in variables ) {
var variableTexte = '$'+variables[i];
var variableCode = eval(variableTexte);
var s = str.replace(variables[i], variableCode);
str = s;
}

...mais comme j'ai modifié ton code... ça bug... laugh.gif C'est p'être ma regex... Je ne vois pas mon erreur...

Ce message a été modifié par toluol - 19 Oct 2015, 22:51.
Go to the top of the page
 
+Quote Post
scoch
posté 20 Oct 2015, 12:06
Message #13


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 820
Inscrit : 1 Jul 2010
Membre no 156 073



Je ne suis pas certain de comprendre ton projet.
Si tu veux une structure HTML unique pour PHP et JS, pourquoi ne centralises-tu pas cette structure dans PHP pour la passer à JS en AJAX ?

Et sinon, dans ton exemple ci-dessus, tu déclares les variables couleur1 et couleur2 dans JS. C'est normal ? Tu ne veux pas les transmettre de PHP ?

Oui, pas besoin d'encadrer les variables de @, tu peux les préfixer avec $ si tu veux, il suffit de changer l'expression régulière.

Exemple avec les variables transmises de PHP :

Code
// Récupérer les variables de PHP dans une chaîne en AJAX
var variablesPHP = '$var1 = "bleu"; $var2 = "rouge";';
// La source reçue en AJAX
var sourcePHP = '$var1 et $var2 sont des variables.';
// Appliquer les variables PHP
var source = appliquerVariablesPHP(variablesPHP, sourcePHP);

function appliquerVariablesPHP(vars, chaine) {
    // Créer les variables locales JS (on ajoute "var " devant)
    vars = vars.replace('$', 'var $');
    eval(vars);

    // Appliquer les variables PHP
    var variables = chaine.match(/(?:^|)\$(\w+)/g);
    for( var i in variables ) {
        chaine = chaine.replace(variables[i], eval(variables[i]));
    }
    return chaine;
}

console.log(source);// bleu et rouge sont des variables.




Exemple avec les variables déclarées en JS :

Code
// Variables
var $var1 = 'bleu';
var $var2 = 'rouge';
// La source reçue en AJAX
var sourcePHP = '$var1 et $var2 sont des variables.';
// Appliquer les variables PHP
var source = appliquerVariablesPHP(sourcePHP);

function appliquerVariablesPHP(chaine) {
    // Appliquer les variables
    var variables = chaine.match(/(?:^|)\$(\w+)/g);
    for( var i in variables ) {
        chaine = chaine.replace(variables[i], eval(variables[i]));
    }
    return chaine;
}

console.log(source);// bleu et rouge sont des variables.


--------------------
L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
Go to the top of the page
 
+Quote Post
toluol
posté 20 Oct 2015, 23:22
Message #14


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



chouette, ça marche comme ça ! merci beaucoup ! Je désespérais de ne pas y arriver.

Le projet est "tout con" : C'est un système sans bouton "valider" pour ajouter des entrées à une table sql, les supprimer et les réorganiser selon une position par des fonctions de drag and drop. J'ai donc, par exemple une table mysql avec 3 entrées (id: 1-3). Mon programme me liste donc ces 3 entrées en php avec des <ul><li data-id=1></li><li datat-id=2>...<ul> dans un tableau. J'ai un bouton (+) et en jquery, il appelle une fonction ajax qui insert une nouvelle ligne avec le dernier id en cours issu de la table... (pour pouvoir l'effacer, ou le modifier, le réorganiser tout aussi directement)

Mais jusqu'à présent, j'avais du code qui se ressemblait dans des portions de php et de javascript (peut-être 4-5 fois) alors que c'était toujours le même principe : une structure html + des variables... Je vais donc maintenant pouvoir avoir une seule source, ce qui est très pratique pour l'évolutivité du code.

Après, ce n'est peut-être pas très "sécurisé", mais ce n'est que pour moi.
Go to the top of the page
 
+Quote Post
Jaypee
posté 21 Oct 2015, 08:47
Message #15


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



J'ai l'impression que tu cherches à faire du "CRUD scaffolding" en PHP/JS.
En gros, c'est créer automatiquement une grille de saisie ou un tableau index à partir d' une base de données. si c'est ce que tu recherches, en googlant "CRUD Scaffolding PHP" tu trouveras des indices utiles.
( un exemple commercial (€€) mais qui illustre bien http://codecanyon.net/item/xcrud-data-mana...preview/3215400 ) ce genre de grille est automatiquement générée. Si l'ordre est important, il y a une icône "poignée" ou des flèches (dans la démo voir "ordering" tout en bas du menu de démo) pour déplacer la ligne. D'ailleurs, cette démo est buguée, la sélection devrait rester sur la ligne déplacée.

Un petit conseil pour la sécurité, ajoute un commentaire pour toi-même en haut du code "Attention: Pas de sécurité", parce qu'un jour, pris par le temps, tu seras tenté de réutiliser ton code dans un contexte où la sécurité est nécessaire.
J-P

Ce message a été modifié par Jaypee - 21 Oct 2015, 09:16.
Go to the top of the page
 
+Quote Post
toluol
posté 21 Oct 2015, 10:02
Message #16


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Oui, c'est cela. Mais je préfère mon système de réorganisation car on peut déplacer la ligne où on veut d'un coup (et non pas juste "Monter" et "descendre" qui produisent des clics inutiles), et surtout créer une hiérarchie sur plusieurs niveaux (style gestionnaire de fichiers).

Pour la sécurité optimale, de toute manière, il me semble que dès qu'on fait de l'ajax, "c'est foutu"... ! laugh.gif
(Les variables, du moins, sont visibles et identifiables... Après, si elles sont traitées "sans faille" en php avant insertion dans la base, je ne comprends pas toujours les risques, mais...
Par prudence, je n'utilise pas ajax pour des choses où la sécurité est prépondérante.


EDIT :
En fait, je crois que j'ai tout compliqué pour rien ! rotfl.gif
tout est modifié en ajax par des fichiers php et rien par javascript... Il me suffisait donc de faire une fonction php appelée dans mes diverses fonctions et fichier ajax qui recalculent les variables et retourne un nouveau code html à javascript !!!


Ce message a été modifié par toluol - 21 Oct 2015, 13:41.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 16th April 2024 - 18:16