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 :

PCRE - Remplacer mot sauf dans un href ? [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 35
    Par défaut PCRE - Remplacer mot sauf dans un href ?
    Bonjour,

    Je viens chercher un peu d'aide car je tourne en rond ...
    Je veux remplacer un mot par lien sauf dans un lien

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $string = 
    'Ce mot doit être remplacé mais pas dans ce lien 
    sur le <a href="1-mot-2">mot</a> et remplacé ici aussi ce mot';
    $patterns = '/(\bmot\b)/i';
    $replacements = '<a href="1-${1}">${1}</a>';
    Ceci me remplace aussi le motif 'mot' dans le href du lien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ce mot doit être remplacé mais pas dans ce lien sur le mot-2">mot et remplacé ici aussi ce mot
    Je n'arrive pas à exclure cette situation du pattern.

    Merci d'avance pour votre aide !
    A bientôt
    Seb

  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 : 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
    Ca dépend un peu de la structure de tes liens, surtout pour l'assertion arrière qui n'accepte pas de pattern variable.
    Mais si la structure que tu as donné est fixe, tu pourrais rechercher de ce côté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $str = 
    'Ce mot doit être remplacé mais pas dans ce lien 
    sur le <a href="1-mot-2">mot</a> et remplacé ici aussi ce mot';
    $reg = '#( (?<! href="1- ) \bmot\b (?! \s*</a>) )#ix';
    $rep = '<a href="1-${1}">${1}</a>';
    print preg_replace($reg, $rep, $str);

  3. #3
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 35
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    C'est une bonne piste mais en fait mes liens sont de la forme :
    mot,2.html
    ou 2 est un id de bd pouvant aller jusqu'à 3 chiffres.
    Donc ça coince avec un pattern fixe ...

  4. #4
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Vaut mieux "mot,id.html" que "id,mot.html" comme souligné par s.n.a.f.u

    Essai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#( (?<! href=" ) \bmot\b (?!\d{1,3}\.html)(?!\s*?</a>) )#ix';

  5. #5
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 35
    Par défaut
    Bonjour,

    Merci de votre coup de pouce !!
    Pour ne pas remplacer le mot dans l'url, je m'en suis sorti avec une assertion arrière négative calée sur le schéma des URLs.

    Par contre, j'ai un soucis sur des mots composés dérivés de mot 'simple' déja dans un pattern :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $texte = "Je suis gourmand, j'aime la glace mais surtout la glace au chocolat";
     
    $mots[1] = 'gourmand';
    $mots[10] = 'glace';
    $mots[20] = 'glace au chocolat';
     
    foreach($mots as $id => $mot)
    {
    $patterns[$id] = "#((?<!belle-url/$mot,$id)(\b$mot\b)(?!\s*?</a>))#i";
    $replacements[$id] = '<a href="http://mon-domaine.com/belle-url/'.$mot.','.$id.'">${1}</a>';
    }
     
    echo nl2br(preg_replace($patterns, $replacements, $texte));
    En fait un passage remplace bien glace au chocolat mais lors du passage suivant me re-remplace glace donc ça donne :

    Je suis gourmand, j'aime la glace mais surtout la glace au chocolat

    Je me doute bien qu'il faut améliorer le pattern mais je ne m'en sors pas ...

    A bientôt
    Seb

  6. #6
    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
    Et si tu intervertis les indices de "glace" et "glace au chocolat", avec un petit changement dans le pattern :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $texte = "Je suis gourmand, j'aime la glace mais surtout la glace au chocolat";
     
    $mots[1] = 'gourmand';
    $mots[20] = 'glace au chocolat';
    $mots[10] = 'glace';
     
    foreach($mots as $id => $mot)
    {
    $patterns[$id] = "#((?<!belle-url/$mot,$id)(\b$mot\b)(?![^<]*?</a>))#i";
    $replacements[$id] = '<a href="http://mon-domaine.com/belle-url/'.$mot.','.$id.'">${1}</a>';
    }
     
    echo nl2br(preg_replace($patterns, $replacements, $texte));

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/07/2014, 19h46
  2. [RegEx] Remplacer URL par des liens sauf dans les balises
    Par raph37 dans le forum Langage
    Réponses: 7
    Dernier message: 19/10/2013, 19h31
  3. Remplacer {mot} par autre chose dans un string
    Par rXpCH dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2011, 13h06
  4. Remplacer mot dans un fichier text !
    Par Marie.B dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 25/01/2009, 13h38
  5. remplacer mots dans un fichier
    Par berg dans le forum Langage
    Réponses: 9
    Dernier message: 30/03/2008, 23h29

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