Discussion:
preg_replace_callback et passage de parametres
(trop ancien pour répondre)
Jack\.R
2008-08-21 12:19:10 UTC
Permalink
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
Mickaël Wolff
2008-08-21 15:55:36 UTC
Permalink
Post by Jack\.R
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
2008-08-21 15:55:36 UTC
Permalink
Post by Jack\.R
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
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
Mickaël Wolff
2008-08-22 11:01:31 UTC
Permalink
Post by CrazyCat
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
2008-08-23 12:24:05 UTC
Permalink
Post by Mickaël Wolff
Post by CrazyCat
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
Jack\.R
2008-08-23 12:24:05 UTC
Permalink
Post by Jack\.R
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, ...)
<?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
CrazyCat
2008-08-24 16:41:46 UTC
Permalink
Post by Jack\.R
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
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
Stephane V
2008-08-22 10:37:36 UTC
Permalink
Post by Jack\.R
Bonjour,
J'utilise preg_replace_callback($regexp, 'maFoncton', $source) qui permet
d'effectuer un remplacement sur une expression régulière(rationnelle).
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
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
Jack\.R
2008-08-23 12:24:05 UTC
Permalink
Post by Stephane V
Post by 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
Continuer la lecture sur narkive:
Loading...