![]() |
| |||||||
| S'inscrire | FAQ | Membres | Calendrier | Recherche | Messages du jour | Marquer les forums comme lus |
![]() |
| LinkBack | Outils de la discussion | Modes d'affichage |
| |||
| 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 |
| | ||||
| ||||
| |
| |||
| 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 |
| |||
| 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 |
| |||
| 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'yavais pas pensé. Bien vu l'artiste. -- Mickaël Wolff aka Lupus Michaelis http://lupusmic.org |
| |||
| 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( '|(<a href=")(?!/)(?!http://)(?!#)(.*?)(".*?>)(.*?)(</a>)|U', '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 = ' <img src="'.$this->params['base_url'].$iconFilename.'"'; $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( '|(<a href=")(?!/)(?!http://)(?!#)(.*?)(".*?>)(.*?)(</a>)|U', 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( '|(<a href=")(?!/)(?!http://)(?!#)(.*?)(".*?>)(.*?)(</a>)|U', create_function( '$matches', 'return convertLinks3($matches,$base_url, $doc_path, $filetypes_path);' ), $source); return $result; } /* CrazyCat end */ function Main() { $source = <<<EOD <ul> <li> Screenshot: <a href="image.gif" title="image.gif"><img src="v_image.gif" title="Screenshot" alt="Screenshot" /></a> </li> <li> Exe: <a href="exe.zip" title="exe.zip">exe.zip</a></li> <li> Source: <a href="src.zip" title="src.zip">src.zip</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 |
| |||
| Le Fri, 22 Aug 2008 10:37:36 +0000, Stephane V a écrit: > On 21 août, 14:19, "Jack\.R" <jac...***free.fr> wrote: >> 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 |
| |||
| 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 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 |
| |
| |
![]() |
| Tags: parametres, passage |
| Outils de la discussion | |
| Modes d'affichage | |
| |