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 :

Du str_replace au milieu d'un preg_replace


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Du str_replace au milieu d'un preg_replace
    Alors là les enfants accrochez-vous bien :p Je vais vous présenter ma super fonction qui envoie des variables PHP à du JavaScript qui les transforme en $_GET... m'enfin ça ne fonctionne pas tout à fait. o_O

    Si vous n'avez rien compris ça ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $html = preg_replace($pattern, '<a href="javascript:openPopUp(\'test.php?data=$1\')";>$1</a> ?>
    Pour faire clair, ça remplace dans la page une partie des éléments pour les transformer en liens hypertextes qui ouvrent des pop-ups dont le contenu dépend du clic de départ (j'ai défini la fonction openPopUp dans un fichier JS et ça fonctionne bien).

    Le petit souci est que parfois $pattern contient des ' (simple quotes) et forcément ça fait mongoliser JavaScript qui ne reçoit pas un argument correct (lorsqu'il n'y a pas de ', la fonction a le comportement souhaité). Le souci ne me semblait pas insurmontable j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $html = preg_replace($pattern, '<a href="javascript:openPopUp(\'test.php?data=' . addslashes('$1') . '\')";>$1</a> ?>
    Mais ça n'a rien changé. En fait les fonctions str_* ne fonctionnent pas à l'intérieur d'un preg_replace, elles sont tout simplement ignorées.

    Quelqu'un a une idée plus intelligente que la mienne ?
    Merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il faut que vous utilisiez la fonction preg_replace_callback ou bien le modificateur e (n'ayant pas le motif, je ne détaillerais pas plus cette dernière solution).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $out = preg_replace_callback($pattern,
        function ($matches) {
            return '<a href="javascript:openPopUp(\'test.php?data=' . htmlspecialchars(addcslashes($matches[1], "'\r\n\\"), ENT_COMPAT/*, 'ISO-8859-1'*/) . '\')";>' . $matches[1] . '</a>';
        },
        $in
    );
    (non testé)

    (PHP >= 5.3 requis pour ce dernier code, sinon il sera nécessaire de sortir la fonction de rappel ou demandera à se tourner vers une fonction lambda - create_function).

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Ta solution est parfaite ! Merci beaucoup !

    Le seul hic est que mon serveur est en PHP 5.2.12, car le site sur lequel je travaille n'est pas tout à fait compatible PHP 5.3

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Le sujet n'étant pas marqué résolu, avez-vous compris les adaptations possibles à réaliser ?

    1) "Externaliser" la fonction de rappel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function cb_preg_replace_callback($matches) {
        return '<a href="javascript:openPopUp(\'test.php?data=' . htmlspecialchars(addcslashes($matches[1], "'\r\n\\"), ENT_COMPAT/*, 'ISO-8859-1'*/) . '\')";>' . $matches[1] . '</a>';
    }
     
    $out = preg_replace_callback($pattern,
        'cb_preg_replace_callback',
        $in
    );
    2) Créer une fonction lambda (c'est ce qui a de plus proche des fermetures mais ce n'est pas très "joli") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $out = preg_replace_callback($pattern,
        create_function('$matches', "return '<a href=\"javascript:openPopUp(\'test.php?data=' . htmlspecialchars(addcslashes(\$matches[1], \"'\\r\\n\\\\\"), ENT_COMPAT/*, 'ISO-8859-1'*/) . '\')\";>' . \$matches[1] . '</a>';"),
        $in
    );


    (avec toujours l'option supplémentaire du modificateur e, ce qui donnerait quelque chose de proche, mais un peu plus simple, que la fonction anonyme en terme de syntaxe)

Discussions similaires

  1. [RegEx] str_replace vs expression régulière et preg_replace.
    Par mr_asta dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2010, 15h27
  2. liste chainée :suppression milieu par rapport à un caractère
    Par Pouyou le caribou dans le forum C++
    Réponses: 4
    Dernier message: 06/06/2005, 18h49
  3. pc de burautique en milieu industriel
    Par norac dans le forum Ordinateurs
    Réponses: 16
    Dernier message: 20/04/2005, 08h59
  4. [XHTML] centrer un tableau au milieu d'un div - bug firefox
    Par mondiani dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 07/02/2005, 23h57
  5. [Licence] Serveur Web en milieu professionnel
    Par tripop dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 1
    Dernier message: 22/10/2004, 14h10

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