preg_replace_callback et passage de parametres

Le
Jack\.R
Bonjour,

J'utilise preg_replace_callback($regexp, 'maFoncton', $source) qui permet
d'effectuer un remplacement sur une expression régulière(rationnelle).

Ma fonction de callback st donc de la forme:
function maFonction($matches)

J'ai besoin de passer des paramètres supplémentaires à ma fonction. pour
le moment j'utilise des $GLOBALS['param1'], $GLOBALS['param2'], ce
qui me déplaît fortement !

Je n'arrive pas à trouver comment passer des paramètres à la fonction
callback qui serait alors de la forme:
function maFonction($matches, $param1, $param2, )

Y a-t-il un moyen de faire cela proprement ?

--
Jack.R
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #16594021
Jack.R a écrit :

Y a-t-il un moyen de faire cela proprement ?



Tu peux simuler les functors, bien connus des développeurs C++.

<?php

class functor
{
protected $params ;

public funciton __construct()
{
$this->params = array() ;
}

public function __set($name, $value)
{
$this->params[$name] = $value;
}

public function call($matches)
{
// traitement en fonction de $this->params
}
}

$f = new functor ;
$f->max_length = 42 ;

preg_replace('`^(w)+$`', array($f, 'call'), 'des mots et encore des
mots') ;

?>
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
CrazyCat
Le #16594041
Jack.R wrote:
Ma fonction de callback st donc de la forme:
function maFonction($matches)
J'ai besoin de passer des paramètres supplémentaires à ma fonction. pour
le moment j'utilise des $GLOBALS['param1'], $GLOBALS['param2'], ... ce
qui me déplaît fortement !
Je n'arrive pas à trouver comment passer des paramètres à la fonction
callback qui serait alors de la forme:
function maFonction($matches, $param1, $param2, ...)



Tu peux essayer:
<?php
preg_replace_callback(
$pattern,
create_function(
'$matches',
'return maFonction($matches, $param1, $param2);'
),
$datas
);
?>

Ainsi, tu crées une fonction qui appelle ton autre fonction.



--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Stephane V
Le #16599321
On 21 août, 14:19, "Jack.R"
Bonjour,

J'utilise preg_replace_callback($regexp, 'maFoncton', $source) qui permet
d'effectuer un remplacement sur une expression régulière(rationnelle).

Ma fonction de callback st donc de la forme:
function maFonction($matches)

J'ai besoin de passer des paramètres supplémentaires à ma fonction. pour
le moment j'utilise des $GLOBALS['param1'], $GLOBALS['param2'], ... ce
qui me déplaît fortement !

Je n'arrive pas à trouver comment passer des paramètres à la fonction
callback qui serait alors de la forme:
function maFonction($matches, $param1, $param2, ...)

Y a-t-il un moyen de faire cela proprement ?

--
Jack.R



Salut

pourquoi tu utilises pas

func_get_args()

http://fr.php.net/manual/fr/function.func-get-args.php

qui te retourne les elements passé en parametre de ta fonction sous
forme de tableaux

cdt,

Sv
Mickaël Wolff
Le #16599381
CrazyCat a écrit :

Ainsi, tu crées une fonction qui appelle ton autre fonction.



Il avait demandé une solution propre ;) Mais c'est vrai que je n'y
avais pas pensé. Bien vu l'artiste.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Jack\.R
Le #16606431
Le Thu, 21 Aug 2008 15:55:36 +0000, CrazyCat a écrit:

Jack.R wrote:
Ma fonction de callback st donc de la forme: function
maFonction($matches)
J'ai besoin de passer des paramètres supplémentaires à ma fonction.
pour le moment j'utilise des $GLOBALS['param1'], $GLOBALS['param2'],
... ce qui me déplaît fortement !
Je n'arrive pas à trouver comment passer des paramètres à la fonction
callback qui serait alors de la forme: function maFonction($matches,
$param1, $param2, ...)



Tu peux essayer:
<?php
preg_replace_callback(
$pattern,
create_function(
'$matches',
'return maFonction($matches, $param1, $param2);'
),
$datas
);
?>

Ainsi, tu crées une fonction qui appelle ton autre fonction.



Sauf qu'il faut être encore un petit peu plus vicieux car le code ci-
dessus ne fonctionne pas (cf mon message précédent s'il apparît un
jour ...).
Il faut préalablement construire sous forme d'une chaîne de caractères le
code de la fonction:

<?php

// les params sont du texte, donc il faut les mettre entre '
$code_fct = 'return maFonction($matches,''.$param1.'',''.$param2.'');'

preg_replace_callback(
$pattern,
create_function(
'$matches',
$code_fct
),
$datas
);
?>

Merci !


--
Jack.R
http://jack.r.free.fr
Jack\.R
Le #16606441
Le Fri, 22 Aug 2008 11:01:31 +0000, Mickaël Wolff a écrit:

CrazyCat a écrit :

Ainsi, tu crées une fonction qui appelle ton autre fonction.



Il avait demandé une solution propre ;) Mais c'est vrai que je n'y
avais pas pensé. Bien vu l'artiste.



L'idée ma parue vicieuse à souhait mais il me semblait avoir lu qu'il y
avait un hic:
Create function ne reçoit qu'un seul argument ($matches).
Au sein de la fonction, donc dans le return, seul ce paramètre est connu.
Les autres variables disponibles ne peuvent être utilisées dans la
fonction car elles lui sont inconnues.

Voici un code exemple, tel que je l'écrit:

function convertLinks($matches) {
$pos = mb_strpos($matches[2], '"');
$filename = mb_substr($matches[2], 0, $pos);
$icon = '';
$pos = mb_strrpos($filename, '.');
if ($pos !== false) {
$ext = mb_strtolower(mb_substr($filename, $pos + 1));
if (!in_array($ext, array('gif', 'png', 'jpg', 'jpeg', 'bmp'))) {
$iconFilename = $GLOBALS['filetypes_path'].'icon_'.$ext.'.png';
$icon = ' <img src="'.$GLOBALS['base_url'].$iconFilename.'"';
$icon .= ' title="'.$ext.'" alt="'.$iconFilename.'" /> ';
$link = 'download.php?file='.$matches[2];
} else {
$link = $GLOBALS['doc_path'].$matches[2];
}
}

$result = '';
$result .= $matches[1].$link.$matches[3];
$result .= $matches[4].$icon.$matches[5];

return $result;
}

function adaptLinks1($source, $base_url, $doc_path, $filetypes_path) {
$result = '';

$GLOBALS['base_url'] = $base_url;
$GLOBALS['doc_path'] = $doc_path;
$GLOBALS['filetypes_path'] = $filetypes_path;

$result = preg_replace_callback(
'|( 'convertLinks',
$source);
return $result;
}

/* Mickaël Wolff start */

class functor
{
protected $params ;

public function __construct()
{
$this->params = array() ;
}

public function __set($name, $value)
{
$this->params[$name] = $value;
}

public function call($matches)
{
$pos = mb_strpos($matches[2], '"');
$filename = mb_substr($matches[2], 0, $pos);
$icon = '';
$pos = mb_strrpos($filename, '.');
if ($pos !== false) {
$ext = mb_strtolower(mb_substr($filename, $pos + 1));
if (!in_array($ext, array('gif', 'png', 'jpg', 'jpeg', 'bmp'))) {
$iconFilename = $this->params['filetypes_path'].'icon_'.
$ext.'.png';
$icon = ' $icon .= ' title="'.$ext.'" alt="'.$iconFilename.'" /> ';
$link = 'download.php?file='.$matches[2];
} else {
$link = $this->params['doc_path'].$matches[2];
}
}

$result = '';
$result .= $matches[1].$link.$matches[3];
$result .= $matches[4].$icon.$matches[5];

return $result;
}
}

function adaptLinks2($source, $base_url, $doc_path, $filetypes_path) {
$result = '';
$f = new functor ;

$f->base_url = $base_url;
$f->doc_path = $doc_path;
$f->filetypes_path = $filetypes_path;

$result = preg_replace_callback(
'|( array($f, 'call'),
$source);
return $result;
}

/* Mickaël Wolff end */


/* CrazyCat start */
function convertLinks3($matches,$base_url, $doc_path, $filetypes_path) {
$pos = mb_strpos($matches[2], '"');
$filename = mb_substr($matches[2], 0, $pos);
$icon = '';
$pos = mb_strrpos($filename, '.');
if ($pos !== false) {
$ext = mb_strtolower(mb_substr($filename, $pos + 1));
if (!in_array($ext, array('gif', 'png', 'jpg', 'jpeg', 'bmp'))) {
$iconFilename = $filetypes_path.'icon_'.$ext.'.png';
$icon = ' <img src="'.$base_url.$iconFilename.'"';
$icon .= ' title="'.$ext.'" alt="'.$iconFilename.'" /> ';
$link = 'download.php?file='.$matches[2];
} else {
$link = $doc_path.$matches[2];
}
}

$result = '';
$result .= $matches[1].$link.$matches[3];
$result .= $matches[4].$icon.$matches[5];

return $result;
}

function adaptLinks3($source, $base_url, $doc_path, $filetypes_path) {
$result = '';

$result = preg_replace_callback(
'|( create_function(
'$matches',
'return convertLinks3($matches,$base_url, $doc_path,
$filetypes_path);'
),
$source);
return $result;
}

/* CrazyCat end */


function Main() {
$source = <<<EOD
<ul>
<li> Screenshot:
title="Screenshot" alt="Screenshot" /></a>
</li>
</ul>
EOD;

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'."n";
echo ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."n";
echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"
lang="fr">'."n";
echo ' <head>'."n";
echo ' <meta http-equiv="Content-Type" content="text/html;
charset=utf-8"/>'."n";
echo ' <meta http-equiv="Content-Language" content="fr" />'."n";
echo ' <title>test</title>'."n";
echo ' </head>'."n";
echo ' <body>'."n";

echo '<h1>Source</h1>'."n";
echo $source."n";
echo '<h1>Solution actuelle</h1>'."n";
echo adaptLinks1($source, 'mon/chemin/', 'mes/documents/', 'leurs/
images/')."n";
echo '<h1>Solution Mickaël Wolff</h1>'."n";
echo adaptLinks2($source, 'mon/chemin/', 'mes/documents/', 'leurs/
images/')."n";
echo '<h1>Solution CrazyCat</h1>'."n";
echo adaptLinks3($source, 'mon/chemin/', 'mes/documents/', 'leurs/
images/')."n";

echo ' </body>'."n";
echo '</html>'."n";

}

Main();





--
Jack.R
http://jack.r.free.fr
Jack\.R
Le #16606451
Le Fri, 22 Aug 2008 10:37:36 +0000, Stephane V a écrit:

On 21 août, 14:19, "Jack.R"
Bonjour,

J'utilise preg_replace_callback($regexp, 'maFoncton', $source) qui
permet d'effectuer un remplacement sur une expression
régulière(rationnelle).

Ma fonction de callback est donc de la forme: function
maFonction($matches)




Salut

pourquoi tu utilises pas

func_get_args()

http://fr.php.net/manual/fr/function.func-get-args.php

qui te retourne les elements passé en parametre de ta fonction sous
forme de tableaux

cdt,

Sv



Bonjour,

Peux-tu préciser ta pensée ?

Pour moi, preg_replace_callback($regexp, 'maFoncton', $source) ne fournit
à maFonction qu'un seul paramètre (un array) correspondant aux chaînes
capturées par la regexp.
Je ne vois pas comment adjoindre d'autres éléments à cet array que je
pourrait ensuite exploiter par func_get_args?

A+

--
Jack.R
http://jack.r.free.fr
CrazyCat
Le #16614131
Jack.R wrote:
Sauf qu'il faut être encore un petit peu plus vicieux car le code ci-
dessus ne fonctionne pas (cf mon message précédent s'il apparît un
jour ...).
Il faut préalablement construire sous forme d'une chaîne de caractères le
code de la fonction:



Tout à fait, je me suis rendu compte de mon erreur à la re-lecture de
mon post, une fois celui-ci publié.
Mais bon, vive le travail communautaire :)

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Publicité
Poster une réponse
Anonyme