8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis en train de migrer mes applications de php 5.3 vers 5.5. J'avais un bout de code qui fonctionnait à merveille, mais qui me met désormais une alerte E_DEPRECATED quand j'utilise preg_replace avec l'option "/e".

Voici le bout de code :

	
function secure_var_display($varDisplay,$type_secure="") {

		$varDisplay = htmlentities(stripslashes($varDisplay), ENT_QUOTES, "ISO8859-15");

		if ($type_secure=="br") {$varDisplay = nl2br($varDisplay);}

		// Ancien Code en PHP 5.3 qui pose pb en php 5.5
		$in = array ( 
		 '(<(/?i\b.*?)>)ie',
		 '(<(/?a\b.*?)>)ie',
		 '(<(/?b\b.*?)>)ie' 
		);
		$varDisplay = preg_replace($in, "'<'.html_entity_decode('$1',ENT_QUOTES).'>'", $varDisplay);
		// Fin Ancien Code en PHP 5.3 qui pose pb en php 5.5

		return $varDisplay;

	}


Il faut donc que je remplace la fonction preg_replace par preg_replace_callback. Le pb est que je ne comprends pas ce que fait ce bout de code avec pregreplace, car je suis nul en expression régulière. J'ai pourtant essayé plusieurs fois de comprendre tout seul, mais rien n'y fait. En passant, si quelqu'un a un tuto me permettant d'enfin comprendre ce serait top.

Mes questions :
1- Quelqu'un peut-i l m'expliquer ce que fait ce bout de code :
		$in = array ( 
		 '(&lt;(/?i\b.*?)&gt;)ie',
		 '(&lt;(/?a\b.*?)&gt;)ie',
		 '(&lt;(/?b\b.*?)&gt;)ie' 
		);
		$varDisplay = preg_replace($in, "'<'.html_entity_decode('$1',ENT_QUOTES).'>'", $varDisplay);

2- Comment remplacer par preg_replace_callback pour avoir le même résultat

Grand merci pour votre réponse.
Regarde si ton code est compatible avec la version de php 5.5

Il y a souvent des changements à effectuer pour la migration d'une version php à l'autre.
Modifié par CVS (10 Jul 2015 - 17:45)
En fait théoriquement tu n'as pas besoin de comprendre ce que font ces regex pour faire le changement. Tu n'as pas besoin de les modifier, si ce n'est bien sûr enlever l'option e.

Par contre tu dois savoir comment fonctionne l'option e. Ce e est l'abréviation de eval et comme il l'indique, il a pour effet d'exécuter la chaîne de remplacement comme si c'était du code php.

Mécaniquement, tu dois juste mettre la chaîne de remplacement dans une fonction et utiliser cette fonction comme callback pour preg_replace_callback. La seule petite subtilité est le tableau de capture.

Pour tes regex, ici, la fonction de callback serait :


function ($m) {
return '<'.html_entity_decode($m[1],ENT_QUOTES).'>';
}


J'espère que ça t'éclaire suffisament pour que tu puisses intervenir sur le reste de ton code.
Merci CVS pour ta réponse, mais c'est bien ce que je mettais au début de mon post : je migre mon code de php 5.3 vers 5.5 ... donc il y a évidemment un bout de code qui pose pb avec php 5.5.

Grand merci QuentinC pour ta réponse qui m'aide un peu plus. J'ai donc fait :

		
$in = array ( 
		 '(&lt;(/?i\b.*?)&gt;)i',
		 '(&lt;(/?a\b.*?)&gt;)i',
		 '(&lt;(/?b\b.*?)&gt;)i' 
		);

		$varDisplay = preg_replace_callback($in, function ($m) { return "'<'.html_entity_decode('$1',ENT_QUOTES).'>'"; }, $varDisplay);


Le problème, c'est que php me mt en erreur la ligne avec le preg_replace_callback, c'est la fonction anonyme dont il ne veut pas. J'ai essayé de sortir la fonction anonyme, en l'affectant à une variable, et j'ai mis cette dernière en deuxième argument de la fonction preg_replace_callback, mais rien n'y fait ... il me semble pourtant avoir la bonne syntaxe, comme dans les exemples.

Sinon, pour le sens de ce bout de code, je commence à me souvenir pourquoi j'avais mis ça, c'est pour l'interprêtation de xml issu d'une base de données.

Merci pour votre aide.
Normal qu'il y a une erreur, tu as oublié d'adapter le contenu de la fonction.

Dans mon exemple tu aurais dû voir que ce n'est pas un bête copier-coller, il faut adapter un peu. $1 n'est pas un nom valide.


		$varDisplay = preg_replace_callback($in, function ($m) { return '<'.html_entity_decode($m[1],ENT_QUOTES).'>'; }, $varDisplay);
Oui, mais avant de répondre je n'ai pas seulement essayé bêtement de mettre le code que tu m'avais fourni. La réponse au dessus n'est qu'un résumé de ce que j'ai pu essayé ... et dans mon code de base avec preg_replace qui fonctionnait, il y avait bien un '$1', ça ne m'a pas paru complètement absurde de le tester.

Voici donc une partie de ce que j'ai pu essayer :


$varDisplay = preg_replace_callback($in, function ($m) { return "'<'.html_entity_decode('$1',ENT_QUOTES).'>'"; }, $varDisplay);


J'ai également essayé ça :


$varDisplay = preg_replace_callback($in, function ($m) { return '<'.html_entity_decode($m[1],ENT_QUOTES).'>'; }, $varDisplay);


ou ça :


$varDisplay = preg_replace_callback($in, function ($m) { return "'<'.html_entity_decode($m[1],ENT_QUOTES).'>'"; }, $varDisplay);


et d'autres solutions, sans que ça fonctionne plus. J'en suis arrivé à supprimer tout ce qui était dans le return pour faire :

$varDisplay = preg_replace_callback($in, function ($m) { return "1"; }, $varDisplay); 


ou

$varDisplay = preg_replace_callback($in, function ($m) { return 1; }, $varDisplay); 


et ça aussi c'est mis en erreur, ce qui prouve bien que ça vient de la fonction anonyme qui ne passe pas. Je ne comprends pas ce qui se passe. As-tu essayé ton bout de code dans dreamweaver juste pour vérifier la syntaxe ?

Merci pour ta réponse et pour le temps que tu prends pour y répondre.
Modifié par cybergud (13 Jul 2015 - 23:02)
a écrit :
et ça aussi c'est mis en erreur, ce qui prouve bien que ça vient de la fonction anonyme qui ne passe pas. Je ne comprends pas ce qui se passe. As-tu essayé ton bout de code dans dreamweaver juste pour vérifier la syntaxe ?


Non je n'ai pas vérifié la syntaxe. Mon but était surtout de te donner un exemple qu'il te fallait adapter.
Mais c'est pas grave, on va le faire tout de suite :


test67667.php

<?php
$varDisplay = preg_replace_callback($in, function ($m) { return 1; }, $varDisplay);
?>



C:\wamp\www>php -v
PHP 5.4.16 (cli) (built: Jun  5 2013 21:01:46)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

C:\wamp\www>php -l test67667.php
No syntax errors detected in test67667.php



test67668.php

<?php
		$varDisplay = preg_replace_callback($in, function ($m) { return '<'.html_entity_decode($m[1],ENT_QUOTES).'>'; }, $varDisplay);
?>



C:\wamp\www>php -l test67668.php
No syntax errors detected in test67668.php


Désolé, je n'ai pas php 5.5; mais ça ne change rien. A moins d'un bug de régression auquel je ne crois pas trop, ces codes ne devraient pas être tout à coup faux s'ils marchaient avec php 5.4.
Ton erreur est donc ailleurs.