Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/03/2006, 10h16   #1
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 48
Points : 35
Points : 35
Par défaut preg_replace ou preg_callback ?

Bonjour,

J'ai un petit problème avec une fonction preg, la preg_replace,
en exemple ce sera tout de suite clair :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
function parse_img($text,$widthvoulu)
{
 $text=preg_replace('#\<img src="(.+)" />#isU',func_img('$1',$widthvoulu), $text);
 return $text;
}
 
function func_img($src,$widhtvoulu)
{
 $size=getimagesize($src);
 $width=$size[0];
 $height=$size[1];
 $height=$widhtvoulu*$height/$width;
 return '<a href="'.$src.'" target="_blank"><img src="'.$src.'" width="'.$widhtvoulu.'" height="'.$height.'" /></a>';  
}
 
 $text='<html><img src="01.jpg" /><br />Introduction:</span><br /><br /><img src="test.gif" /></html>';
 
 echo parse_img($text,300);
 
 
?>
Voila le probleme c'est que la variable $1 ne s'applique pas (celui du preg_replace) et je ne trouve pas de solutions.... ??
On m'a dit d'utiliser le commutateur e pour y remedier, mais cela n'a pas l'air de fonctionner...
Est-ce que quelqu'un pourrait m'aider? merci.
zoneaide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2006, 10h25   #2
Modérateur
 
Avatar de Nesmontou
 
Homme Benjamin PREVOT
Architecte de système d'information
Inscription : septembre 2004
Messages : 1 568
Détails du profil
Informations personnelles :
Nom : Homme Benjamin PREVOT
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Architecte de système d'information
Secteur : Finance

Informations forums :
Inscription : septembre 2004
Messages : 1 568
Points : 2 493
Points : 2 493
Salut, il me semble que dans ton cas, il faut utiliser preg_replace_callback pour appeler une fonction externe.

Bon développement
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

F.A.Q. : Java, PHP, (X)HTML / CSS

N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème
Nesmontou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2006, 11h55   #3
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

fieldset te disait pourtant ici qu'il a testé et que cela fonctionne, ce à quoi tu as répondu que cela fonctionne pour toi également.


[Edit] Ah, je vois ton souci, tu ne peux pas utiliser $1 comme paramètre d'une fonction à l'intérieur de preg_replace(). Ce genre de variable n'est disponible que depuis l'intérieur de preg_replace().
Tu as deux solutions :
  • L'une est proposée par Nesmontou
  • L'autre est de copier le contenu de func_img() dans parse_img() et d'utiliser directement le HTML de la balise A dans l'appel à preg_replace(). Si tu n'as pas besoin de func_img() à un autre endroit, je te recommande cette solution ; sinon, l'autre.

[P.S.] C'est du boulot d'essayer d'orienter sans donner la solution toute prête, je me demande même si je suis compréhensible :/
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2006, 19h40   #4
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 48
Points : 35
Points : 35
Merci pour vos réponses, je vais essayer cela ce soir
zoneaide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 08h19   #5
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 48
Points : 35
Points : 35
Je voulais vous dire que je n'arrive pas à utiliser comme il faut la fonction preg_replace_callbak, et pur ton expliquation, elle est un peu vague (pour moi) je crois de plus en plus que ce n'est pas faisable par ma methode...
zoneaide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 10h08   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Voyons voyons, avec un pseudo pareil ^^

Code non testé mais qui devrait s'approcher de la solution finale :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function parse_img($text, $widthvoulu){
   $size = getimagesize($src);
   $width = $size[0];
   $height = $size[1];
   $height = $widhtvoulu*$height/$width;
   $link_part1 = '<a href="';
   $link_part2 = '" target="_blank"><img src="';
   $link_part3 = '" width="'.$widhtvoulu.'" height="'.$height.'" /></a>';
 
   $text=preg_replace('#\<img src="(.+)" />#isU', $link_part1."$1".$link_part2."$1".$link_part3, $text);
   return $text;
}
Peut-être faut-il simplement mettre des guillemets doubles et non simples pour utiliser $1. Pas testé.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 10h40   #7
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 48
Points : 35
Points : 35
argh, je vois que tu n'avais pas vu pour le redimentionnement de l'image en effet, vu que tu as changé de fonctions, le $src devrait etre $1 si tu vois ce que je veux dire Donc cela ne fonctionnera pas :p
zoneaide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 11h29   #8
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Arf, désolé, j'avais inversé les appels :/

Voici la solution avec un callback, c'est tout de suite plus propre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
define('WIDTH_VOULU', 50);
 
function func_img($matches){
   if(!($size    = @getimagesize($matches[1]))){
      return '';
   }
   else{
      $width   = $size[0];
      $height  = $size[1];
      $height  = WIDTH_VOULU * $height / $width;
      return '<a href="'.$matches[1].'" target="_blank"><img src="'.$matches[1].'" width="'.WIDTH_VOULU.'" height="'.$height.'" /></a>';
   }
}
 
function parse_img($text){
   return preg_replace_callback('#\<img src="(.+)" />#isU', 'func_img', $text);
}
 
$text='<html><img src="01.jpg" /><br />Introduction:</span><br /><br /><img src="test.gif" /></html>';
 
echo parse_img($text, 300);
 
?>
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 13h25   #9
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 48
Points : 35
Points : 35
Merci beaucoup, j'ai modifié quelques trucs et maintenant mes fonctions sont parfaites je vous remercie beaucoup pour votre aide, je n'étais pas loin avec ce callback, je m'étais orienté vers le callback quand l'on ma parlé de cette $1 utilisable que dans la fonction... Merci encore
zoneaide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 13h38   #10
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
De rien

Tant mieux si tu as adapté ma propositon à tes besoins, c'est l'objectif de ce forum !

Pense au bouton Résolu, s'il-te-plaît.
++
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h16.


 
 
 
 
Partenaires

Hébergement Web