FluxBB.fr

Le site des utilisateurs francophones de FluxBB.

Vous n'êtes pas identifié(e).

#1 08-04-2013 21:20:48

bagu
Membre
Lieu : Loire-Atlantique
Inscription : 24-06-2009
Messages : 129
Site Web

Message d'erreur pre_replace_callback

Bonjour,

Je maintiens un vieux forum fluxbb moddé un peu partout mais qui tourne pas mal.
Suite à une mise à jour de PHP, j'obtiens ce message récurrent :

[08-Apr-2013 21:12:28 Europe/Paris] PHP Deprecated:  preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in \include\parser.php on line 852

Qui correspond à :

$text = preg_replace($pattern, $replace, $text);

Je me doute du coup que le problème vient sans doute de l'expression régulière, mais pas de /e à l'horizon.
Sauriez vous m'aider à corriger cela ?
Merci

Hors ligne

#2 08-04-2013 22:12:06

PascL
Membre
Inscription : 06-09-2007
Messages : 554
Site Web

Re : Message d'erreur pre_replace_callback

Salut,

Tu dois être passé en php5.5 d'après ce que je lis là: http://www.php.net/manual/fr/reference. … ifiers.php
(Le e est dans le tableau $pattern)

Ya un exemple sur le lien donné pour remplacer.

Hors ligne

#3 08-04-2013 22:27:08

bagu
Membre
Lieu : Loire-Atlantique
Inscription : 24-06-2009
Messages : 129
Site Web

Re : Message d'erreur pre_replace_callback

Certes, il y a un exemple, cependant, il me semble impossible a adapter aisément.
En effet, l'exemple fourni une fonction dans laquelle on reprend le pattern en dur.

Or dans le fichier parser.php, ils y en a un paquet, des pattern.
Du coup trouver comment obtenir une fonction générique, cela dépasse mes compétences.

Je me demande comment fluxbb va contourner le problème puisqu'il me semble que l'option eval est aussi utilisée dans la toute dernière version de fluxbb.
Merci de votre attention.

Dernière modification par bagu (08-04-2013 22:27:22)

Hors ligne

#4 09-04-2013 10:15:35

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

PHP 5.5 est toujours en beta et n'est pas sorti, donc ça m'étonnerais fortement que le problème soit là.
Avec FluxBB 1.5.3, il est utilisé ucp_preg_replace à la ligne 851 de parser.php, fonction qui est définie dans functions.php avec le commentaire suivant :
// Replace string matching regular expression
//
// This function takes care of possibly disabled unicode properties in PCRE builds


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#5 09-04-2013 22:24:59

bagu
Membre
Lieu : Loire-Atlantique
Inscription : 24-06-2009
Messages : 129
Site Web

Re : Message d'erreur pre_replace_callback

Fichtre, cela m'a donc échappé !
Je vais voir comment faire pour transposer cela au forum actuel.

Merci beaucoup

Hors ligne

#6 10-04-2013 09:34:30

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

Je tiens à préciser que ce problème se posera vraiment avec PHP 5.5.x. J'ai posé la question aux développeurs sur FluxBB.org. Les modifications pour transposer preg_replace avec modifier "e" en preg_replace_callback ne sont pas simples à implémenter, surtout pour le traitement de tableaux pattern et replace. J'étudie... siffle


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#7 10-04-2013 12:32:13

bagu
Membre
Lieu : Loire-Atlantique
Inscription : 24-06-2009
Messages : 129
Site Web

Re : Message d'erreur pre_replace_callback

Diantre ! Je suis donc eu et re-eu happy
Bien, ben je vais patienter alors wink

Hors ligne

#8 10-04-2013 18:15:02

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

Relativement simple à faire pour remplacer un "preg_replace" avec modificateur de pattern "e" sur une seule chaine, par "preg_replace_callback".
Par exemple, pour traiter les citations (quote), dans parser.php on a :

$text = preg_replace('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%se', '"</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), \'$2\')." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>"', $text);

que l'on remplace par :

//[modif oto] for PHP 5.5.0 - Replacement of preg_replace and pattern modifier "e" with preg_replace_callback
$callback = function ($matches) {
	global $lang_common; 
	return "</p><div class=\"quotebox\"><cite>".str_replace(array('[', '\\"'), array('&#91;', '"'), $matches[2])." ".$lang_common['wrote']."</cite><blockquote><div><p>";
	};
$text = preg_replace_callback('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%s', $callback, $text);

Mais, je n'ai pas encore trouvé l’algorithmie lorsque l'on a affaire à des tableaux de "pattern" et de "replace" et avec des fonctions "callback" différentes.
Je cogite...


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#9 11-04-2013 09:46:21

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

La modification que j'ai donné pour supporter PHP 5.5 utilise les fonctions anonymes or, cette possibilité n'a été introduite qu'à partir de PHP 5.3.0, ce qui fait que cette manière de faire ne sera pas compatible avec une ancienne version de PHP < 5.3.0.

J'ai donc utilisé la fonction create_function qui est supportée par les versions de PHP < 5.3.0.

//[modif oto] for PHP 5.5.0 - Replacement of preg_replace and pattern modifier "e" with preg_replace_callback
$callback = create_function ('$matches',
	'global $lang_common;
	return "</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), $matches[2])." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>";'
	);
$text = preg_replace_callback('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%s', $callback, $text);

De plus, cela simplifie drastiquement les modifications de la chaîne replace pour la transformer en fonction callback ; il n'y a que les variables des regex à modifier, par exemple \'$2\' en $matches[2].


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#10 11-04-2013 17:44:29

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

C'est « relativement » simple à remplacer preg_replace avec modificateur "e" en preg_replace_callback lorsque la règle de recherche (pattern) et celle de remplacement (replace) sont des éléments simples et pas des tableaux.
Ça devient un  peu plus complexe dans le cas de tableaux, car seulement quelques éléments peuvent avoir le modificateur "e".
Prenons par exemple le fichier parser.php et la fonction  do_bbcode qui utilise preg_replace sur des tableaux avec de nombreux éléments et d'autant plus nombreux si on a mis en place une barre BBcode comme FluxToolBar.

J'ai fait un essai en traitant séparément les modificateurs "e". Ça fonctionne très bien, mais il y a peut-être mieux.

Le code originel est (lignes 833-839):

	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\', \'$2\')';

	// This thing takes a while! :)
	$text = preg_replace($pattern, $replace, $text);

	return $text;

Remplacé par

	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\', \'$2\')';

	// This thing takes a while! :)
	//$text = preg_replace($pattern, $replace, $text);
	// This thing takes a while and may be another while!
	//[modif oto] for PHP 5.5.0 - Replacement of preg_replace and pattern modifier "e" with preg_replace_callback
	//Separate patterns with "e" modifier and without
	$pattern_normal = $replace_normal = array();
	for($i = 0; $i < count($pattern) ; $i++)
	{
		if(substr($pattern[$i],-1) == "e")
		{
			$temp = str_replace(array('\'$1$3\'','\'$2$4\'','\'$1\'', '\'$2\'', '$1', '$2'), array('$matches[1].$matches[3]','$matches[2].$matches[4]','$matches[1]','$matches[2]','$matches[1]','$matches[2]'), $replace[$i]);
			$text = preg_replace_callback(substr($pattern[$i],0,-1), create_function('$matches','return '.$temp.';'), $text);
		}
		else
		{
			$pattern_normal[] = $pattern[$i];
			$replace_normal[] = $replace[$i];
		}
	}
	$text = preg_replace($pattern_normal, $replace_normal, $text);
	//[modif oto] - end

	return $text;

Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#11 12-04-2013 17:13:33

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

Je préfère la solution ci-dessous qui ne demande que très peu de modifications des scripts, et seulement si besoin.

On ajoute deux fonctions dans include/functions.php

//[modif oto] for PHP 5.5.0 - Replacement of preg_replace and pattern modifier "e" with preg_replace_callback
function php55_callback($element)
{
	return str_replace(
		array('\'$1$3\'','\'$2$4\'','\'$1\'', '\'$2\'', '$1', '$2'),
		array('$matches[1].$matches[3]','$matches[2].$matches[4]','$matches[1]','$matches[2]','$matches[1]','$matches[2]'),
		$element);
}

//Separate patterns with "e" modifier and without
function php55_preg_replace($pattern, $replace, $text)
{
	if(!is_array($pattern)) {
		$pattern = array($pattern);
		$replace = array($replace);
	}
	$count = count($pattern);
	$pattern_normal = $replace_normal = array();
	for($i = 0; $i < $count ; $i++)
	{
		if(substr($pattern[$i],-1) == "e")
			$text = preg_replace_callback(substr($pattern[$i],0,-1), create_function('$matches','return '.php55_callback($replace[$i]).';'), $text);
		else
		{
			$pattern_normal[] = $pattern[$i];
			$replace_normal[] = $replace[$i];
		}
	}
	if(empty($pattern_normal))
		return $text;
	else
		return preg_replace($pattern_normal, $replace_normal, $text);
}

Et on ne modifie que les appels à preg_replace qui en ont besoin (Erreurs sous PHP 5.5.x) par php55_preg_replace.
Par exemple, dans include/parser.php, tous les preg_replace qui ont $re_list comme premier paramètre, par exemple :

	// Tidy up lists
	$temp = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $text);

par

	// Tidy up lists
	$temp = php55_preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $text);

Actuellement, je n'ai pas (encore) « balayé » tous les appels à preg_replace dont le pattern de recherche a le modificateur "e".


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#12 17-04-2013 16:38:37

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

Pour le support de PHP 5.5.x, plutôt que d'écrire une fonction « magique », il est, de loin, préférable de modifier chaque appel preg_replace(...) qui utilise un pattern avec modificateur "e", par un appel à preg_replace_callback(...) avec une fonction en second paramètre ; comme cela, ça reste compatible avec PHP < 5.5.0 et ça utilise un code correct, sans usine à gaz.
Il n'y a que include/parser.php et la function ucp_preg_replace dans include/functions.php à modifier.
Il faut néanmoins porter attention à ce que, contrairement à preg_replace(...), preg_replace_callback(...) n'accepte pas de tableau (array) comme second paramètre (fonction à exécuter).

La nouvelle fonction ucp_preg_replace devient :

//
// Replace string matching regular expression
//
// This function takes care of possibly disabled unicode properties in PCRE builds
// [modif oto] - Added $callback parameter to use preg_replace_callback
// in place of preg_replace with modifier "e" on pattern
function ucp_preg_replace($pattern, $replace, $subject, $callback = false)
{
	if($callback) 
		$replaced = preg_replace_callback($pattern, create_function('$matches', 'return '.$replace.';'), $subject);
	else
		$replaced = preg_replace($pattern, $replace, $subject);

	// If preg_replace() returns false, this probably means unicode support is not built-in, so we need to modify the pattern a little
	if ($replaced === false)
	{
		if (is_array($pattern))
		{
			foreach ($pattern as $cur_key => $cur_pattern)
				$pattern[$cur_key] = str_replace('\p{L}\p{N}', '\w', $cur_pattern);

			$replaced = preg_replace($pattern, $replace, $subject);
		}
		else
			$replaced = preg_replace(str_replace('\p{L}\p{N}', '\w', $pattern), $replace, $subject);
	}

	return $replaced;
}

Et, sans donner toutes les modifications de parser.php, voilà quelques exemples :
Remplacer :

$re_list = '%\[list(?:=([1a*]))?+\]((?:[^\[]*+(?:(?!\[list(?:=[1a*])?+\]|\[/list\])\[[^\[]*+)*+|(?R))*)\[/list\]%ie';

par

// [modif oto] - Suppress modifier "e" to be used for preg_replace_callback for PHP 5.5.x
$re_list = '%\[list(?:=([1a*]))?+\]((?:[^\[]*+(?:(?!\[list(?:=[1a*])?+\]|\[/list\])\[[^\[]*+)*+|(?R))*)\[/list\]%i';

Remplacer :

	$temp = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $text);

par

	//[modif oto] - preg_replace_callback for PHP 5.5.x
	$temp = preg_replace_callback($re_list, create_function('$matches', 'return preparse_list_tag($matches[2], $matches[1]);'), $text

Remplacer :

		$text = preg_replace('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%se', '"</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), \'$2\')." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>"', $text);

par

		//[modif oto] - replace prege_replace with pattern and modifier "e" into preg_replace_callback for PHP 5.5.x
		$text = preg_replace_callback('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%s', create_function('$matches', 'global $lang_common; return "</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), $matches[2])." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>";'), $text);

Puis dans la longue liste des $pattern[] et $replace[], on remplacera tous ceux qui contiennent le modificateur "e" dans $pattern[], par exemple (Tous ne sont pas donnés):
Remplacer :

		$pattern[] = $re_list;
		$replace[] = 'handle_list_tag(\'$2\', \'$1\')';

par

		$pattern_callback[] = $re_list;
		$replace_callback[] = 'handle_list_tag($matches[2], $matches[1])';

Remplacer :

	$pattern[] = '%\[topic\]([1-9]\d*)\[/topic\]%e';
	$pattern[] = '%\[topic=([1-9]\d*)\](.*?)\[/topic\]%e';
	$pattern[] = '%\[post\]([1-9]\d*)\[/post\]%e';
	$pattern[] = '%\[post=([1-9]\d*)\](.*?)\[/post\]%e';
	$pattern[] = '%\[forum\]([1-9]\d*)\[/forum\]%e';
	$pattern[] = '%\[forum=([1-9]\d*)\](.*?)\[/forum\]%e';
	$pattern[] = '%\[user\]([1-9]\d*)\[/user\]%e';
	$pattern[] = '%\[user=([1-9]\d*)\](.*?)\[/user\]%e';

	$replace[] = 'handle_url_tag(\'$1\')';
	$replace[] = 'handle_url_tag(\'$1\', \'$2\')';
	$replace[] = '<a href="mailto:$1">$1</a>';
	$replace[] = '<a href="mailto:$1">$2</a>';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=$1\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=$1\', \'$2\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=$1#p$1\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=$1#p$1\', \'$2\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=$1\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=$1\', \'$2\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\')';
	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\', \'$2\')';

par

	$pattern_callback[] = '%\[topic\]([1-9]\d*)\[/topic\]%';
	$pattern_callback[] = '%\[topic=([1-9]\d*)\](.*?)\[/topic\]%';
	$pattern_callback[] = '%\[post\]([1-9]\d*)\[/post\]%';
	$pattern_callback[] = '%\[post=([1-9]\d*)\](.*?)\[/post\]%';
	$pattern_callback[] = '%\[forum\]([1-9]\d*)\[/forum\]%';
	$pattern_callback[] = '%\[forum=([1-9]\d*)\](.*?)\[/forum\]%';
	$pattern_callback[] = '%\[user\]([1-9]\d*)\[/user\]%';
	$pattern_callback[] = '%\[user=([1-9]\d*)\](.*?)\[/user\]%';

	$replace_callback[] = 'handle_url_tag($matches[1])';
	$replace_callback[] = 'handle_url_tag($matches[1], $matches[2])';
	$replace[] = '<a href="mailto:$1">$1</a>';
	$replace[] = '<a href="mailto:$1">$2</a>';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=.$matches[1]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=.$matches[1],$matches[2]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=.$matches[1].#p.$matches[1]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=.$matches[1].#p.$matches[1],$matches[2]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=.$matches[1]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=.$matches[1],$matches[2]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=.$matches[1]\')';
	$replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=.$matches[1],$matches[2]\')';

Ensuite, il va falloir traiter, un par un, tous les élements $callback_replace, donc, remplacer :

	// This thing takes a while! :)
	$text = preg_replace($pattern, $replace, $text);

	return $text;

par

	// This thing takes a while! :)
	$text = preg_replace($pattern, $replace, $text);
	//[modif oto] - Loop for preg_replace_callback as this function does not accept array as second parameter
	$count = count($pattern_callback);
	for($i = 0 ; $i < $count ; $i++)
	{
		$text = preg_replace_callback($pattern_callback[$i], create_function('$matches', 'return '.$replace_callback[$i].';'), $text);
	}
	return $text;

Les deux appels à ucp_preg_replace.
Remplacer :

	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(https?|ftp|news){1}://([\p{L}\p{N}\-]+\.([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5://$6\', \'$5://$6\', true).stripslashes(\'$4$10$11$12\')', $text);
	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)+[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5.$6\', \'$5.$6\', true).stripslashes(\'$4$10$11$12\')', $text);

par

	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(https?|ftp|news){1}://([\p{L}\p{N}\-]+\.([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%ui', 'stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5]."://".$matches[6], $matches[5]."://".$matches[6], true).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])', $text, true);
	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)+[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%ui','stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5].$matches[6], $matches[5].$matches[6], true).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])', $text, true);

Je réitère le fait que toutes les modifications nécessaires ne sont pas données. En principe FluxBB 1.5.4 sera compatible PHP 5.5.0


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#13 20-04-2013 14:38:01

bagu
Membre
Lieu : Loire-Atlantique
Inscription : 24-06-2009
Messages : 129
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

Vu les modification faites sur mon forum, je pense attendre la version 1.5.4 afin de tout mettre à jour d'un coup.
Merci de ces explications.

Par contre, je ne comprends pas pourquoi ils ont déprécier cette fonctionnalité. Cela red l'écriture des scripts sacrément plus complexe.

Hors ligne

#14 20-04-2013 17:24:19

adaur
Membre
Lieu : Derrière Notepad ++ !
Inscription : 25-09-2008
Messages : 1 937
Site Web

Re : Message d'erreur pre_replace_callback

Bonjour,

Tu peux faire ceci si tu veux màj progressivement (merci Oto pour la modif wink).


"As code is more often read than written it's really important to write clean code." - Franz
Twitter: @adaurfr
Mon fork de FluxBB: FeatherBB

Hors ligne

#15 20-04-2013 19:13:45

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : Message d'erreur pre_replace_callback

bagu a écrit :

Cela rend l'écriture des scripts sacrément plus complexe.

Bonjour,

C'est vrai. Mais c'est une autre démarche, il faut raisonner en terme de function et non plus de regex pour le terme de remplacement. En plus, preg_replace_callback n'accepte pas les tableaux (array) comme élément de remplacement.

Note : Bien penser, par exemple, qu'en regex $5$6 n'est pas le même chose que $5.$6 Plus de trois heures de recherches et d'essais pour trouver où était passé ce foutu point qui manquait dans une url.


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

#16 20-04-2013 21:19:34

bagu
Membre
Lieu : Loire-Atlantique
Inscription : 24-06-2009
Messages : 129
Site Web

Re : Message d'erreur pre_replace_callback

adaur a écrit :

Bonjour,

Tu peux faire ceci si tu veux màj progressivement (merci Oto pour la modif wink).

Ouep, mais non happy

J'ai un peu trop de retard...La fonction ucp_preg_replace n'existe pas dans ma version du fichier functions.php
J'ai une version 1.4.2 avec plein de patch de sécurité dessus happy

C'est pour ça que je disais que j'allais attendre un peu...D'autant qu'il va me falloir retrouver quelques mods (color of group et anniversaire par exemple)

D'ailleurs, j'ai peur pour la migration de la base de donnée. ^^

D'ailleurs, en parlant du mod anniversaire, c'est dommage que ce ne soit pas une information du profil dans fluxbb. Car cela permettrait de faire ds section interdites aux mineurs par exemple (bon, ce n'est qu'un exemple, mais il y  a pleins d'usages pour cette information...Même si on peut facilement mentir sur son age)

Dernière modification par bagu (20-04-2013 21:20:28)

Hors ligne

#17 04-05-2013 08:00:59

Mpok
Néo Admin
Inscription : 10-08-2006
Messages : 2 950
Site Web

Re : Message d'erreur pre_replace_callback

Otomatic a écrit :

Pour le support de PHP 5.5.x, plutôt que d'écrire une fonction « magique », il est, de loin, préférable de modifier chaque appel preg_replace(...) qui utilise un pattern avec modificateur "e", par un appel à preg_replace_callback(...) avec une fonction en second paramètre ; comme cela, ça reste compatible avec PHP < 5.5.0 et ça utilise un code correct, sans usine à gaz.
Il n'y a que include/parser.php et la function ucp_preg_replace dans include/functions.php à modifier.
Il faut néanmoins porter attention à ce que, contrairement à preg_replace(...), preg_replace_callback(...) n'accepte pas de tableau (array) comme second paramètre (fonction à exécuter).

Je réitère le fait que toutes les modifications nécessaires ne sont pas données. En principe FluxBB 1.5.4 sera compatible PHP 5.5.0

Excellent. mdr
J'ai utilisé la méthode pour un porjet qui n'avait rien à voir avec FluxBB.

Hors ligne

Pied de page des forums