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 des occurences d'un mot dans un texte


Sujet :

Langage PHP

  1. #1
    bruce-willis
    Invité(e)
    Par défaut Preg_replace des occurences d'un mot dans un texte
    Bonjour,

    Je cherche une expression régulière qui permet de remplacer un mot dans un texte. Le soucis c'est que je suis novice en regex donc j'ai cherché par les exemples existants en passant par sources regex, le site de cyberzoide, etc.
    J'ai pas trouvé!

    Je cherche par exemple à remplacer "bail" dans le texte mais avec str_replace(), ça remplace tout: bailleur, embaillement, tout ce qui contient bail en fait or je ne veux que remplacer "bail" ou "bails"

  2. #2
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    Quelque chose comme ceci te suffirait ?
    Je te conseille d'utiliser un logiciel d'aide aux expressions régulières, comme The Regex Coach que je trouve très bien.

  3. #3
    bruce-willis
    Invité(e)
    Par défaut
    Merci d'avoir répondu aussi rapidement, j'avance un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $text = eregi_replace("(bail|bails)[\. \n\t]","BRUCE","bail du bailleur (bail) sans embaillement: bail.");
    echo $text;
    ?>
    Cela affiche
    BRUCEdu bailleur (bail) sans embaillement: BRUCE
    Le soucis c'est que ça enleve l'espace après et ne reconnaît pas (bail) mais bon ce dernier n'est pas grave mais l'espace enlevé si

  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
    Les fonctions POSIX (ereg*) sont dépréciées. Il est vivement recommandé de se tourner vers celles de l'extension PCRE (preg_*), qui offrent bien plus de possibilités dont le délimiteur de mot \b (dépendant de la locale) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $out = preg_replace('~\bbails?\b~i', $replacement, $in);

  5. #5
    bruce-willis
    Invité(e)
    Par défaut
    En effet, j'ai remarqué que ereg_ est souvent considéré comme deprecated
    J'ai vu que preg_replace ne gère plus le crochet

    Et ton code, ça marche julp sauf que j'ai oublié de dire que ce que je cherche à faire n'est pas de remplacer le mot d'une occurence comme mon exemple mais le transformer en lien donc on met <a></a> autour du mot trouvé

    Il me semble donc que je ne ferai pas de preg_replace directement mais une fonction de recherche d'abord puis de remplacement

  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 777
    Points
    17 777
    Par défaut
    C'est possible avec preg_replace, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $out = preg_replace('~\bbails?\b~i', '<a href="toto.php">\0</a>', $in);
    Par contre, si la chaîne de remplacement est "dynamique" et non statique, comme ci-dessus, il faudra s'orienter vers la fonction preg_replace_callback (à moins que le modificateur e ne puisse suffire).

  7. #7
    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
    Points : 3 545
    Points
    3 545
    Par défaut
    Juste une petite remarque : la forme recommandée serait plutôt la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $out = preg_replace('~\bbails?\b~i', '<a href="toto.php">$0</a>', $in);
    Pour ceux qui ne voit pas la différence, utilisation du $ au lieu du \ dans le remplacement, ce qui permet entre autre de ne pas se mélanger avec les références arrières

  8. #8
    bruce-willis
    Invité(e)
    Par défaut
    Cool!

    Ça marche même avec des mots avec espace, ce \b est vraiment génial
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $text = preg_replace('~\bressources? naturelles?\b~i','<a href="toto.php">$0</a>',"les ressources naturelles du ressource naturellement (bail) sans ressource naturelle.");
    echo $text;
    ?>
    Merci

Discussions similaires

  1. [Tableaux] occurences d'un mot dans un texte
    Par Kassar dans le forum Langage
    Réponses: 8
    Dernier message: 27/11/2008, 20h17
  2. Compter le nombre d'occurences d'un mot dans un texte
    Par AlexandraS dans le forum Langage
    Réponses: 13
    Dernier message: 26/03/2008, 09h12
  3. colorer des occurences d'un mot/phrase dans une page web
    Par hicham_alaoui1 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/08/2007, 02h47
  4. [PHP4] Nombre d'occurences d'un mot dans un fichier
    Par trihanhcie dans le forum Langage
    Réponses: 15
    Dernier message: 06/07/2006, 11h42
  5. Réponses: 8
    Dernier message: 18/01/2005, 10h58

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