ACut a écrit :
Il ne peut pas y avoir de solution générique à ce problème. En effet, il n'y a aucun moyen univoque de séparer, dans une chaîne, ce qui d'un côté est censé être "muet" pour l'interpréteur, de l'autre ce qui est censé être effectivement interprété comme du code PHP.
Par exemple, dans la châine "5 est le résultat de 3 + 2", rien ne dit au programme s'il doit ou non interpréter la séquence 3 + 2. Ainsi, de nombreuses instructions ou fonctions PHP peuvent apparaître tout à fait fortuitement dans un texte et il n'appartient qu'au producteur du texte de décréter où elles commencent et se terminent.
Bref, s'il s'agit de trouver un algorithme global pour répondre à la question posée, il est indispensable d'utiliser un MARQUAGE conventionnel à l'intérieur de la chaîne à mouliner. Tiens, par exemple, le balisage <?...?>...
Dès l'instant qu'un tel marquage existe, le problème peut en effet être traité via eval(), en blindant la détection et le traitement des erreurs. Le travail consiste à sortir les segments marqués (une expression régulière fait généralement l'affaire), à les interpréter puis à les reloger dans la chaîne une fois calculés. Cela suppose en passant que les éléments PHP "produisent" du contenu convertible en chaîne de caractères -- sans parler des problèmes de variables locales,globales, etc., qui pourraient être invoquées dans le code.
Je ne suis pas d'accord avec les commentaires qui tendent à déprécier la fonction eval(). Dans les cas très spécifiques où l'on cherche à interpréter ou interagir dynamiquement avec un code imprévisible fourni par l'utilisateur du programme, eval() est un outil redoutable en ce qu'il ouvre la voie à une sorte de "méta-traitement" et permet des opérations particulièrement sophistiquées.
Les langages interprétés ont beaucoup de défauts, alors concédons-leur quelques originalités bien fertiles. A mon sens, c'est le cas de eval(), quoi qu'en disent les puristes de l'algorithmique.
(Dans le même ordre d'idée, il y a eu une époque où l'on décriait ou du moins sous-estimait les "pointeurs de fonctions" en C. Sans eux, je ne pense pas que les méthodes virtuelles et le polymorphisme en général existeraient en C++ -- NB. Je précise qu'eval et les pointeurs de fonction sont sans rapport, j'observe juste une analogie de comportement vis-à-vis d'eux)
|