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 remplacement précis


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de guillaume40
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 97
    Par défaut preg_replace remplacement précis
    Bonjour,
    J'ai besoin d'effecteur des remplacements dans une chaine de texte.
    Par exemple la chaine est :
    Bonjour ca <a href="">ca</a> va ?

    Et je veux remplacer le "ca" par autre chose mais pas le "ca" qui à un lien dessus.
    Actuellement j'utilise '/\b(?<!\-)('.$linker['mot'].')(?!\-)\b/' mais j'ai vraiment du mal avec les expressions régulières, j'ai trouvé celle là sur des forums mais je ne la comprend même pas.

    Donc j'aimerai la modifier pour qu'elle ne remplace pas les liens.

    Merci d'avance

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    ce que tu peux faire par exemple c'est de remplacer touts les liens pour les protéger des modifications, ensuite tu rajoute les liens au "ça" qui reste et dans la dernière étape tu remets les liens en place

  3. #3
    Membre confirmé Avatar de guillaume40
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 97
    Par défaut
    Mais en fait à la base dans mon texte il n'y à pas de lien.
    Mon script sert à mettre des liens sur des mots clés définit.
    Or si je met 2 liens sur le même mot clé ( 1 mot clé est remplacé qu'une seule fois avec les limite de preg_replace )

    Donc si j'ai 2 liens sur le même mot clés la boucle passe une fois et remplace disons le premier "ca" en lien.
    La 2éme boucle sa va repasser sur le premier "ca"
    Du coup sa fera un truc du genre <a href=""><a href="">ca</a></a>
    Donc je voudrais utiliser l'expression réguliére pour que çà ne prenne que "ca" pas de d'autre mot contenant "ca" par exemple "cas" reste "cas".

  4. #4
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par guillaume40 Voir le message
    Mais en fait à la base dans mon texte il n'y à pas de lien.
    dans ce cas tu peux utiliser la fonction http://php.net/strtr
    elle s'occupe automatiquement de ne pas faire de modification là où elle en a déjà faite

  5. #5
    Membre confirmé Avatar de guillaume40
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 97
    Par défaut
    Mais avec strstr je ne peux pas dire combien je veux de remplacement maximum.

  6. #6
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par guillaume40 Voir le message
    Mais avec strstr je ne peux pas dire combien je veux de remplacement maximum.
    comment ça ? montre nous un exemple

  7. #7
    Membre confirmé Avatar de guillaume40
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 97
    Par défaut
    Par exemple
    Voici le texte original :
    Bonjour, J'adore les chiens et les chats. Mais le chien est un animal extraordinaire ! Un chien, deux chien , trois chiens Des chien...
    J'ai défini 2 liens sur le mot clé chien :
    - 1 lien sur "chien" vers www.google.fr
    - 2 liens sur "chien" vers www.chien.fr

    Avec preg_replace je peux définir lors de l'appel de la fonction le limiteur donc je lui dit que je veux remplacer une fois ou plusieurs.

    Le probléme c'est que je fait une boucle pour les preg_replace.
    Du coup 1er passage sa remplace le 1er chien en lien vers google.fr
    2éme passage de la boucle sa remplace les 2 premiers "chien" en lien vers chien.fr mais le probléme c'est que dans les 2 premiers il repasse sur le chien en lien sur google.fr

    J'espère que c'est compréhensible

  8. #8
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    dans ce cas tu peux utiliser ce que j'expliquais dans mon 1er message : d'abord tu remplace le 1er "chien" par "LIEN_GOOGLE" par exemple. ensuite tu remplace les 2 "chien" suivants par "LIEN_CHIEN".
    et à la fin tu remplace "LIEN_GOOGLE" et "LIEN_CHIEN" par les bons liens

    par contre pour ce genre de remplacement tu n'as peut être pas besoin d'expressions régulières, regarde la fonction http://php.net/str_replace qui consomme moins de ressources et qui permet aussi de limiter le nombre de remplacement

  9. #9
    Membre confirmé Avatar de guillaume40
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 97
    Par défaut
    Haa merci beaucoup
    J'ai réussit à faire ce que je voulais.
    Cependant j'aimerai voir si sa bouffe beaucoup niveau ressource.
    Je suis sur un serveur dédié mais faudrait pas non plus que sa pompe trop
    Il existe pas des fonctions qui affichent ce qu'il a fallut utiliser niveau ressource pour afficher la page ?

  10. #10
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    Une regexp simple pourrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('`[^<](chien)[^>]`',' '.'cequiremplacechien'.' ',$html);
    Avec $html, le texte que tu veux modifier.
    Il faut bien sur remplacer chien par la valeur voulu.

    Petite explication sur la regexp :
    [^<] : un caractère n'étant pas <
    (chien) : la chaine recherché
    [^>] : un caractère n'étant pas >

    Edit : Finalement ce n'est pas forcément une bonne idée. Il faudrait plutôt prendre la regexp suivante : `[ ](mot)[ ]` . Il faudrait s'assurer qu'il n'y a pas d'espace avant et après le texte de la balise a.

  11. #11
    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
    Citation Envoyé par guillaume40 Voir le message
    Haa merci beaucoup
    J'ai réussit à faire ce que je voulais.
    Cependant j'aimerai voir si sa bouffe beaucoup niveau ressource.
    Je suis sur un serveur dédié mais faudrait pas non plus que sa pompe trop
    Il existe pas des fonctions qui affichent ce qu'il a fallut utiliser niveau ressource pour afficher la page ?
    str_replace a de très bonne performances et est beaucoup moins gourmand qu'une expression régulière.
    A mon avis, tu peux y aller les yeux fermés.

  12. #12
    Membre confirmé Avatar de guillaume40
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 97
    Par défaut
    Oui mais en fait d'abord j'utilise un preg_replace qui va modifier les mots par leur ID de leur enregistrement de la BDD, aprés je fais un preg_match pour verifier dans la chaine s'il y a des ID, s'il y en a je les remplaces avec str_replace par leur lien en BDD

Discussions similaires

  1. [RegEx] preg_replace : remplacement de caractères
    Par alio350 dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2013, 16h13
  2. [RegEx] preg_replace remplacer des guillemets
    Par Invité dans le forum Langage
    Réponses: 19
    Dernier message: 07/09/2011, 16h19
  3. [RegEx] preg_replace() remplacement partiel.
    Par Jarode01 dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2009, 09h34
  4. [RegEx] Preg_replace, remplacement PHP
    Par Klyne2 dans le forum Langage
    Réponses: 13
    Dernier message: 18/10/2009, 00h34
  5. [RegEx] Preg_replace remplacer plusieurs fois une variable
    Par C45T0R dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2008, 14h39

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