Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

preg_replace_callback et passage de parametres

8 réponses
Avatar
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

8 réponses

Avatar
Mickaël Wolff
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
Avatar
CrazyCat
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
Avatar
Stephane V
On 21 août, 14:19, "Jack.R" 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 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
Avatar
Mickaël Wolff
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
Avatar
Jack\.R
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
Avatar
Jack\.R
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
Avatar
Jack\.R
Le Fri, 22 Aug 2008 10:37:36 +0000, Stephane V a écrit:

On 21 août, 14:19, "Jack.R" 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
Avatar
CrazyCat
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