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 et option "e" [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Par défaut preg_replace et option "e"
    Bonjour,

    J'ai à ma disposition des liens "mailto" parser avec des balises différentes de html.
    Dans mon cas cela ressemble à ça:
    [mailto:toto@domaine.com|Toto]
    et je suis donc sencé obtenir ça
    <a href="mailto:toto@domaine.com">Toto</a>

    Voila le code que j'ai actuellement (et qui ne fonctionne pas ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $ma_chaine = "[mailto:toto@domaine.com|Toto]";
    $reg ='/\[mailto:(.*)\]/e';
    $replacement = "$mail = explode('|',$1);
    $addr = substr($mail[0],1);
    $nom = substr($mail[1], 0, -1);
    echo \"<a href=\"$addr\">$nom</a>\";";
     
    $ma_chaine = preg_replace($reg, $replacement, $ma_chaine);
    echo $ma_chaine;
    Lorsque j'execute mon code, php me retourne:
    "Notice: Undefined variable: $mail, $addr, $nom" (j'ai abrégé)
    "Parse error: parse error in test.php(num_ligne_dans_source): regexp code on line 1"
    "Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Failed evaluating code: = explode('|',toto@domain.com|Toto); = substr(,1); = substr(,0,-1); .... in test.php(num_ligne_dans_source) on line 35"

    J'en déduis donc que ne connaissant pas les variables, il ne peut les traiter (explode, substr, ...).

    L'option "e" permet d'après la doc php d'interpréter du code php après remplacement si j'ai bien compris ça:
    e (PREG_REPLACE_EVAL)
    Avec cette option, preg_replace() effectue la substitution normale des références arrières dans la chaîne de remplacement, puis l'évalue comme un code PHP, et utilise le résultat pour remplacer la chaîne de recherche. Les guillemets simples, les guillemets doubles, les antislashs et les caractères NULL sont protégés avec des antislashs (\) dans les références arrières substituées.

    Seule preg_replace() utilise cette option. Elle est ignorée par les autres.
    Seulement ...

    Est-ce que le problème vient du seul fait que mes variables sont indéfinies ? si oui comment corriger cette erreur ?

    Merci

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    Non seulement c'est faux, mais en plus /e bouffe les performances. A n'utiliser qu'en dernier recours.

    Essaies ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $ma_chaine = "[mailto:toto@domaine.com|Toto]";
    $reg ='/\[mailto:([^|]+)\|([^\]]+)\]/';
    $rep = '<a href="mailto:$1">$2</a>';
     
    $ma_chaine = preg_replace($reg, $rep, $ma_chaine);
    echo $ma_chaine;

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Par défaut
    Encore une fois tu me sauves .... je sais pas qu'elle expèrience tu as mais je dis respect (en mm tps t'es pas admin pour rien)

    merci

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

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