IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

preg_replace ou preg_callback ? [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 48
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre Expert
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Par défaut
    Salut, il me semble que dans ton cas, il faut utiliser preg_replace_callback pour appeler une fonction externe.

    Bon développement

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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 :/

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 48
    Par défaut
    Merci pour vos réponses, je vais essayer cela ce soir

  5. #5
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 48
    Par défaut
    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...

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Voyons voyons, avec un pseudo pareil ^^

    Code non testé mais qui devrait s'approcher de la solution finale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 48
    Par défaut
    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

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Arf, désolé, j'avais inversé les appels :/

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
     
    ?>

  9. #9
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 48
    Par défaut
    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

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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.
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Remplacer une chaîne avec preg_replace
    Par GregPeck dans le forum Langage
    Réponses: 3
    Dernier message: 08/12/2005, 12h21
  2. [RegEx] preg_replace assez complexe
    Par Info-Rital dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2005, 13h28
  3. [RegEx] problème avec preg_replace
    Par carlos20 dans le forum Langage
    Réponses: 6
    Dernier message: 27/10/2005, 10h29
  4. [RegEx] Preg_replace et affichage de variable
    Par xperienss dans le forum Langage
    Réponses: 6
    Dernier message: 13/10/2005, 13h26
  5. [RegEx] preg_replace : explications sur les caractères spéciaux
    Par Anduriel dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2005, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo