Niouzes.org  

Précédent   Niouzes.org > Forum > Newsgroup fr.comp.lang.* Forum > Newsgroup fr.comp.lang.php
S'inscrire FAQ Membres Calendrier Recherche Messages du jour Marquer les forums comme lus



Réponse

 

LinkBack Outils de la discussion Modes d'affichage
  #1 (permalink)  
Vieux 21/08/2008, 13h19
Jack\.R
 
Messages: n/a
Par défaut preg_replace_callback et passage de parametres

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
Réponse avec citation
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Niouzes.org
Standard Sponsored Links

  #2 (permalink)  
Vieux 21/08/2008, 16h55
Mickaël Wolff
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
  #3 (permalink)  
Vieux 21/08/2008, 16h55
CrazyCat
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
  #4 (permalink)  
Vieux 22/08/2008, 12h01
Mickaël Wolff
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
  #5 (permalink)  
Vieux 23/08/2008, 13h24
Jack\.R
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
  #6 (permalink)  
Vieux 23/08/2008, 13h24
Jack\.R
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
  #7 (permalink)  
Vieux 23/08/2008, 13h24
Jack\.R
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
  #8 (permalink)  
Vieux 24/08/2008, 17h41
CrazyCat
 
Messages: n/a
Par défaut Re: preg_replace_callback et passage de parametres

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
Réponse avec citation
 
Réponse
Tags: ,



Outils de la discussion
Modes d'affichage

Règles de messages
Vous pouvez ouvrir de nouvelles discussions : nonoui
Vous pouvez envoyer des réponses : nonoui
Vous pouvez insérer des pièces jointes : nonoui
Vous pouvez modifier vos messages : nonoui

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui



Fuseau horaire GMT. Il est actuellement 08h53.

Italiano - German - English - Español


Édité par : vBulletin® version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc. Tous droits réservés.
Version française #13 par l'association vBulletin francophone


Politique - Droit - Philosophie - Football - Medicine - Française - Bricolage - Photo - Mac Os X - Divers - Physique - Jardinage
Mecanique - Moto - Photographie - Rail - Route - Aviation - Cinema - Linux - Psychanalyse - Finance - Enigmes - Rugby
Environnement - Histoire - Programmes TV - Education - Travail - Voyages - Windows - Immobilier - Cuisine
Windows XP - Excel - Word - Outlook - Access - Internet Explorer - Office - Vista

Page generated in 0,40713 seconds with 10 queries