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 :

pre_replace probleme double remplacement


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Par défaut pre_replace probleme double remplacement
    Bonjour,

    J'ai un souci avec un bout de mon code.

    J'ai un texte $texte dans lequel je veux modifier des mots par une URL spécifique au mot. Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $tabmot[0] = '/\b(autruche)\b/i';
    $taburl[0] = '<a href="http://www.serpent-autruche.com">$1</a>';
     
    $tabmot[1] = '/\b(serpent)\b/i';
    $taburl[1] = '<a href="http://www.animaux.com/serpent.html">$1</a>';
     
    $texte = preg_replace($tabmot,$taburl,$texte,-1);
     
    echo $texte;
    Le problème c'est que preg_replace remplace bien autruche par le lien mais il remplace aussi le mot serpent contenu dans le lien www.serpent-autruche.com...

    Une idée ?

    Merci d'avance

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Par défaut
    Bonjour,

    tu peux limiter le nombre de remplacement avec un flag :

    voir doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://php.net/manual/fr/function.preg-replace.php
    limit : Le nombre maximal de remplacement pour chaque masque dans chaque chaîne subject. Par défaut, vaut -1 (aucune limite).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Par défaut
    Merci pour la réponse,

    En fait j'ai mal posé mon problème je fais bien un preg_replace au nombre illimité (-1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $tabmot[0] = '/\b(autruche)\b/i';
    $taburl[0] = '<a href="http://www.serpent-autruche.com">$1</a>';
     
    $tabmot[1] = '/\b(serpent)\b/i';
    $taburl[1] = '<a href="http://www.animaux.com/serpent.html">$1</a>';
    le problème ici c'est que le mot 'autruche' sera remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://www.serpent-autruche.com">autruche</a>
    puis sera remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://www.<a href="http://www.serpent-autruche.com">serpent</a>-autruche.com">$1</a>

  4. #4
    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 : 51
    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,

    Tout le tableau de patterns est traité, donc tu peux effectivement avoir plusieurs remplacements successifs.

    Un code de ce genre répondra mieux à ton besoin :

    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
    <?php
    $tabmot[0] = '/\b(autruche)\b/i';
    $taburl[0] = '<a href="http://www.serpent-autruche.com">$1</a>';
     
    $tabmot[1] = '/\b(serpent)\b/i';
    $taburl[1] = '<a href="http://www.animaux.com/serpent.html">$1</a>';
     
    $txt = 'autruche';
     
    foreach($tabmot as $key => $pattern) {
    	$texte = preg_replace($pattern, $taburl[$key], $txt, -1, $count);
    	if ($count) break;
    }
     
    echo $texte;

  5. #5
    Membre très actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Par défaut
    j'ai crois avoir compris ton problème, j'avais essayé de le faire avec des "lookaround" mais je n'ai pas réussi, donc je te propose ça qui n'est pas peut-être très optimal niveau performance mais qui a l'air de marcher

    - on remplace tous les tags <a...>...</a> (on les garde dans un tableau) et leur contenu par <a0/>, <a1/>, <a2/>,... pour les identifier postérieurement, de cette manière pas de risque de remplacer ce qu'il y a à l'intérieur des tags <a>
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $liens = 'mon contenu';
    preg_match_all('`(?<links><a\s+[^>]*>.*?</a>)`si',$liens,$match);
    $links = $match['links'];
    $i = 0;
    while(preg_match('`<a\s+`si',$liens)){
      $liens = preg_replace('`<a\s+[^>]*>.*?</a>`si',"<a$i/>",$liens,1);
      $i++;
    }


    -on remplace tes mots par ce que tu veux (j'ai mis comme exemple remplacer un mot "toto" par "####toto####"
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $liens = preg_replace('`(\b(mot1|mot2|mot3)\b)`si','####$1####',$liens);

    -on remet les tags <a..>..</a> qu'on a précédemment stockés dans un tableau par les <a0/>, <a1/>, <a2/>,...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $i = 0;
    while(preg_match('`<a\d+/>`si',$liens)){
      $liens = preg_replace('`<a\d+/>`si',$links[$i],$liens,1);
      $i++;
    }

Discussions similaires

  1. Problème double-clic -> frm_auto
    Par Moyaku dans le forum Access
    Réponses: 13
    Dernier message: 30/08/2006, 08h55
  2. probleme double ecran !!
    Par Nemesys dans le forum Périphériques
    Réponses: 1
    Dernier message: 28/05/2006, 22h42
  3. Probleme double donne nimporte quoi
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 10/04/2006, 10h41
  4. [VB]probleme double quote dans une ressource de type string
    Par JulienCEA dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/02/2006, 12h38
  5. Probleme avec remplacement de caractere
    Par genzo93 dans le forum ASP
    Réponses: 9
    Dernier message: 18/01/2005, 10h51

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