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 :

Effectuer un remplacement de mot bien précis [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Effectuer un remplacement de mot bien précis
    Bonjour à tous,

    J'ai un petit code permettant de remplacer des mots d'un message par autre chose. Seulement, j'ai quelques soucis de fonctionnement..

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($tabMessage as $word) {
    	if(strlen($word) > 1) {
    		$message = preg_replace("/" . $word . "/", "[+" . $word . "+]", $message, 1);
    	}
    }
    Le problème se trouve dans certains cas comme par exemple : Les étoiles illuminent le ciel.
    Donc j'aimerais récupérer la phrase : [+Les+] [+étoiles+] [+illuminent+] [+le+] [+ciel+].
    Le problème, c'est que je récupère ceci (à cause du le) : [+Les+] [+étoi[+le+]s+] [+illuminent+] le [+ciel+].

    Donc au lieu de faire le changement sur le mot "le", il trouve dans le mot étoile et du coup ça fait pas le résultat que j'attends...

    Avez-vous une solution pour régler cela ?

    Merci d'avance

  2. #2
    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
    Il existe le délimiteur de mot : \b. Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $mot = "la";
    echo preg_replace('#\b(' . $mot . ')\b#i', "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
    Donne :
    Je suis las. A ladite école. La revanche d'une blonde.

    Julp.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Hmm merci, c'est presque bon.. (je ne connais pas trop les expressions régulières en fait.. Surtout avec ces trucs \b ou i, etc.. me faudraitun tableau listant ça avec les explications :p)

    Il ne prend pas en compte les mots avec des accents ? Dans ton exemple, si je modifie le mot à changer par "école", eh bien il fait rien :/

  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
    Ce n'est pas mon cas à moins d'avoir mal compris votre situation. Utiliseriez un encodage "atypique" ou bien des encodages différents ? Pourriez-vous nous donner le code en question ?


    Julp.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    L'encodage est Occidental ISO Latin 1.

    En fait, le code est correct, il fait ce que j'attendais... Mais il ne prend pas tous les mots accentués...

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $mot = "école";
    echo preg_replace('#\b(' . $mot . ')\b#i', "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
    Il n'affichera pas le mot école en gras.. Et j'arrive pas à comprendre pourquoi :-/

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Tu n'as pas le même problème que moi Julp ?

  7. #7
    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
    Non justement pas sous PHP-5.2.0 (PCRE version 6.7).

    Sinon ces alternatives semblent fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $mot = "école";
    $b = '[^\wàâäéèëêîïìöôòüùû]';
    echo preg_replace("#(?<=$b)($mot)(?=$b)#i", "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
    echo '<br/>';
    echo preg_replace("#(?<=\P{L})($mot)(?=\P{L})#i", "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
    (en espérant ne pas m'être planté dans les assertions avant/arrière).


    Julp.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Ah maintenant ça marche niquel... Merci julp !

    Et je met résolu en passant

  9. #9
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par Tommyl
    Surtout avec ces trucs \b ou i, etc.. me faudraitun tableau listant ça avec les explications :p)
    http://fr3.php.net/manual/fr/referen...ence.backslash

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Les accents non reconnus dans une regex est presque toujours un problème de locale du serveur. La solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1');
    Instruction à mettre dans chaque script utilisant les regex ou bien changer les locale du serveur.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  11. #11
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par ripat
    Les accents non reconnus dans une regex est presque toujours un problème de locale du serveur. La solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1');
    Instruction à mettre dans chaque script utilisant les regex ou bien changer les locale du serveur.
    setlocale depend enormement du serveur... donc si on y a pas acces pour avoir la liste des locale définies, c'est TRES difficile de trouver la chaine qui correspond a la locale a utiliser... parmis les variantes possibles :

    french
    fr_FR
    fr_FR.ISO
    fr_FR.euro
    fr_FR@euro
    fr_FR.880
    etc...

    en clair, le setlocale n'est absoluement pas portable...
    S'il est necessaire de l'utiliser quand meme dans un code, je préconise un code de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $localeList=array('french', 'fr_FR', 'fr_FR@euro', 'fr', ...);
    setlocale(LC_ALL, $localeList);
    qui va tester les différentes valeurs jusqu'a ce qu'une réussisse.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2014, 13h56
  2. Réponses: 5
    Dernier message: 08/09/2014, 15h07
  3. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  4. Par quoi remplacer le mot Démarrer?
    Par sourivore dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 08/03/2006, 14h08

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