OVH Cloud OVH Cloud

preg_replace_callback

6 réponses
Avatar
Zouplaz
Bonjour, j'ai un soucis avec cette fonction :

$news_content = preg_replace_callback("'##IMAGE[0-9][D|G]{0,1}##'",
create_function('$matches',
"
return \"Matches = {$matches[0]}\";
src=\"/news/pub_images/{$images[$i]['img_id']}-small.jpg\">
"),
$news_content);

La fonction crée à la volée par create_fonction est bien appellée mais
le tableau $matches ne contient rien...

J'ai aussi essayé $matches[0] - mais rien ne se produit, la valeur
retournée est toujours "Matches ="

Où est mon erreur ?

Merci d'avance

6 réponses

Avatar
Olivier Miakinen

Bonjour, j'ai un soucis avec cette fonction :

$news_content = preg_replace_callback("'##IMAGE[0-9][D|G]{0,1}##'",
[...]
$news_content);


Qu'est-ce que tu as dans $news_content ?

La chaîne de recherche s'attend à trouver un mot avec dans l'ordre :
o) ##IMAGE
o) un chiffre de 0 à 9
o) soit l'un des trois caractères « D », « | » ou « G », soit rien
o) ##

Donc par exemple :
##IMAGE3##
##IMAGE0|##
##IMAGE9D##

Mais pas :
##IMAGE37##
##IMAGE37D##
##IMAGE37|##
##IMAGED##
##IMAGE9DG##

Et pas non plus :
##image7|##

Note au passage que {0,1} peut être remplacé par ? (plus simple à lire),
donc par exemple "'##IMAGE[0-9][D|G]?##'"

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
ASM
Bonjour, j'ai un soucis avec cette fonction :

$news_content = preg_replace_callback("'##IMAGE[0-9][D|G]{0,1}##'",
create_function('$matches',
"
return "Matches = {$matches[0]}";
src="/news/pub_images/{$images[$i]['img_id']}-small.jpg">
"),
$news_content);

La fonction crée à la volée par create_fonction est bien appellée mais
le tableau $matches ne contient rien...


je ne sais ce que fabrique ce preg_replace_callback()
ni si l'expression regulière est bonne
et vais supposer que c'est OK

J'ai aussi essayé $matches[0] - mais rien ne se produit, la valeur
retournée est toujours "Matches ="

Où est mon erreur ?


c'est cataclysmique tout ces ' et " dont il faut :
- respecter l'ordre
- reussir à ce que ce soit pris en compte par des

S'il n'est vraiment pas possible de scinder le code en morceaux compréhensibles
et, à ce que je comprends du bazar,

<http://www.nexen.net/index.php?option=com_nexen_v2&Itemid#2&lang=FR&nexen_url_type=intern&nexen_path=docs%252Fphp%252Fannotee%252Ffunction.preg-replace-callback.php>

j'essaierais ceci :

$news_content = preg_replace_callback(
'##IMAGE[0-9][D|G]{0,1}##',
create_function(
'$matches',
// tout çà sur une seule ligne
'return "Matches = ".{$matches[0]}." src="/news/pub_images/".{$images[$i]['img_id']}."-small.jpg">"'
// fin de ligne unique
),
$news_content
);
echo $news_content;

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
ftc
j'essaierais ceci :

$news_content = preg_replace_callback(
'##IMAGE[0-9][D|G]{0,1}##',
create_function(
'$matches',
// tout çà sur une seule ligne
'return "Matches = ".{$matches[0]}."
src="/news/pub_images/".{$images[$i]['img_id']}."-small.jpg">"'
// fin de ligne unique
),
$news_content
);
echo $news_content;



Les fonctions anonymes c'est bien mais la ça tourne à la skyzophrènie
quand même.

Pourquoi ne pas simplement créer une fonction nommée, ça ajouterait un
peu plus à la lisibilité et c'est quand même le point principal.

Avatar
ASM

Les fonctions anonymes c'est bien mais la ça tourne à la skyzophrènie
quand même.


c'est bien un peu ce que je disais

Pourquoi ne pas simplement créer une fonction nommée, ça ajouterait un
peu plus à la lisibilité et c'est quand même le point principal.


oui, mais ... :
1) le php prévoit qu'on puisse en faire l'économie
2) à quoi çà sert que php se décarcasse avec ses 2 721 fonctions
si c'est pour ne pas (tenter) de les utiliser ?
3) çà fait gagner beucoup de temp !
(seulement 3 jours de débuggage pour 1 ligne)
:-)

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Zouplaz
ftc wrote:




Les fonctions anonymes c'est bien mais la ça tourne à la skyzophrènie
quand même.

Pourquoi ne pas simplement créer une fonction nommée, ça ajouterait un
peu plus à la lisibilité et c'est quand même le point principal.


C'est ce que j'ai finalement fait, les ' "" " ' et autres / des regex
tournaient au cauchemar - pour passer une fonction membre comme
méthode j'ai fait :

$news_content = preg_replace_callback(
"/##IMAGE[$i][GCD]?##/i",
array($this,'preg_callback'),
$news_content);


Avatar
Olivier Miakinen

Pourquoi ne pas simplement créer une fonction nommée, ça ajouterait un
peu plus à la lisibilité et c'est quand même le point principal.


C'est ce que j'ai finalement fait, les ' "" " ' et autres / des regex
tournaient au cauchemar


Ah, en effet, maintenant que tu le dis c'était dans les guillemets qu'il
y avait un problème. Je te cite :

$news_content = preg_replace_callback("'##IMAGE[0-9][D|G]{0,1}##'",


Je m'étais arrêté sur ceci sans lire la suite.

create_function('$matches',


Là c'est bon : grâce aux guillemets simples, le $matches n'est pas
interprété tout de suite.

"
return "Matches = {$matches[0]}";


Mais là ce n'est pas bon. Tu as utilisé des guillemets doubles, donc
$matches est interprété avant même que la fonction preg_replace_callback
ne soit appelée... pas étonnant qu'il soit vide et surtout indépendant
des résultats de recherche !

src="/news/pub_images/{$images[$i]['img_id']}-small.jpg">


Et là c'est pareil. Bon, en plus tu utilises des variables différentes
de $matches, mais de toute façon celles-ci sont interprétées *avant*
tout appel à preg_replace_callback. Rien d'étonnant, donc.

Si tu peux utiliser une fonction ou une méthode nommée, c'est donc mieux
car plus lisible.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)