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 :

problème de remplacement à répétition [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut problème de remplacement à répétition
    Bonjour, j'ai un petit soucis avec ereg_replace, je souhaite transformer une chaine genre :
    {B}mon texte 1{/B} mon texte 2{B}mon texte 3{/B}
    en ceci :
    <b>mon texte 1</b> mon texte 2<b>mon texte 3</b>

    j'utilise le code php suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $data = '{B}mon texte 1{/B} mon texte 2{B}mon texte 3{/B}';
    $data = ereg_replace('(.*)', '<b>\\1</b>', $data);
    le prolème est qu'il me retourne ceci:
    <b>mon texte 1{/B} mon texte 2{B}mon texte 3</b>

    sauriez vous me dire comment faire ?
    merci d'avance.

    PS: en faite j'utilise les crochets plutot que les parenthèse mais ça interfère avec les BBCodes du forum mais bon ca revient au même...

  2. #2
    Membre régulier
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 86
    Points
    86
    Par défaut
    Pourquoi ereg_replace ? Essaye str_replace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $data = str_replace(
     array('{b}', '{/b}'),
     array('<b>', '</b>'),
     $data
    );

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    oui mais le problème c'est que je veut aussi faire des liens genre :
    {LINK src="mon lien"}mon lien{/LINK}
    qui donnerais :
    <a href="mon lien" target="_blank">mon lien</a>

    et là sans les regex c'est moins évident...

  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 778
    Points
    17 778
    Par défaut
    Préférez la fonction preg_replace aux fonctions POSIX. Votre code devrait ressembler à quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $patterns = array(
        '#{b}(.*){/b}#U',
        '#{LINK src="(.*)"}(.*){/LINK}#U',
        // ...
    );
    $replacements = array(
        '<b>$1</b>',
        '<a href="$1">$2</a>',
        // ...
    );
    $out = preg_replace($patterns, $replacements, $in);
    echo $out;
    Le drapeau U est très important car il permet de rendre les expressions régulières non gourmandes : problème que vous rencontrez avec ereg_replace dans votre exemple (si vous souhaitez garder cette fonction remplacez .* par .*? dans votre code). Enfin, je vous recommande la lecture du tutorial Initiation aux expressions régulières en PHP si ce n'est pas déjà fait


    Julp.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    merci pour la solution avec preg_replace, ça marche très bien.

    cela dit pour ereg_replace, le ? ne fonctionne pas ou j'ai pas bien compris où le mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ereg_replace('{B}(.*?){/B}', '<b>\\1</b>', .....);
    si c'est ça, php me genère une erreur.

    PS: je sait que les fonctions perl sont plus rapide et plus puissante mais certaines implémentations ne les ont pas, c'est le cas sur le serveur sur lequel je bosse (chez un FAI).

  6. #6
    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 778
    Points
    17 778
    Par défaut
    Citation Envoyé par mainge
    cela dit pour ereg_replace, le ? ne fonctionne pas ou j'ai pas bien compris où le mettre :
    ereg_replace semble gourmand et on ne peut pas modifier ce comportement Donc il faudrait trouver autre chose : utiliser ereg_replace sur le modèle de str_replace proposé précédemment (cela devrait être adapté pour votre balise link).


    Julp.

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

Discussions similaires

  1. Probléme pour remplacer = dans une variable
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 18
    Dernier message: 05/06/2007, 13h37
  2. [replaceregexp] Problème de remplacement
    Par Gauden dans le forum ANT
    Réponses: 2
    Dernier message: 27/03/2007, 13h22
  3. [Perl] Problème de remplacement de chaine de caractères
    Par LE NEINDRE dans le forum Langage
    Réponses: 3
    Dernier message: 17/10/2006, 09h28
  4. [Tableaux] Problème avec remplacement dans chaîne
    Par Baptiste Wicht dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 10h04
  5. [VB6]Problème de remplacement dans ma MaskedBox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/03/2006, 10h39

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