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 :

str_replace ou preg_replace et comment simplifier ? [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut str_replace ou preg_replace et comment simplifier ?
    Bonjour,
    Je souhaite supprimer quelques pronoms de mes textes, initialement je pensais supprimer tout ce qui avait moins de trois caractères, mais pour des termes comme vin, etc, loi... ça va les bloquer,
    alors que je ne le souhaite pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $textepastrie ="Le bilan climatique des fruits et légumes transportés par avion ou issus de serres chauffées est fortement négatif, le vin etc...";
    ?>
    Comment supprimer de mon $textepastrie ceci (le, des, et, par, ou, de, est, le) pour arriver au résultat ci-dessous...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $texttrie = "bilan climatique fruits légumes transportés avion issus serres chauffées fortement négatif, vin etc...";
    ?>
    Faut-il faire pour chaque pronom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $texttrie = str_replace("le","",$textepastrie);
    $texttrie = str_replace("des","",$textepastrie);
    //etc....
    // str_replace est-il plus approprié que preg_replace ??
    ?>
    Ou il y a plus simple ?

    Merci d'avance
    Yule

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    str_replace peut prendre un tableau en entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str_replace(array(' le ',' de ',' les ',' des '),' ',$string);
    Et oui str_replace est beaucoup plus performant que preg_replace.

    Tant que les remplacements sont simples (ne nécessitent pas de regex) il faut donc le privilégier.

  3. #3
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Le problème ici avec str_replace est que par exemple mode deviendra mo, son "de" aura sauté aussi, donc à moins d'être sûr de pas avoir ce genre de mot, preg_replace est à utiliser

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    C'est pour ça qu'il faut rechercher les pronoms en les entourant d'espaces .

    Après la solution n'est pas parfaite , puisque par exemple les pronoms de début de phrases pourraient être omis.

    Ceci étant dit si le but est de faire un moteur de recherche (ca y ressemble) , il n'est pas nécessaire de se séparer des pronoms et autres mot sans valeur

  5. #5
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Je n'avais pas vu les espaces dans la première version de ton code, peut être une édition ?
    Avec str_replace (ou avec str_ireplace pour les histoires de casse) et avec la phrase donnée, le Le ne "sautera" pas comme tu l'as souligné dans ton message .. Sinon oui utiliser str_replace tant que possible mais me demande encore si c'est approprié dans son cas...

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Le problème avec ce genre de tâches, c'est que ta liste de "mots non-clef" risque de grossir assez vite. Ce qui veut dire que si tu utilises preg_replace qui certes ne parcourra ta chaîne qu'une seule fois, tu vas aboutir à une pattern géante contenant un monstre du genre \b(?:des|de|les|le|la|... 250 mots plus tard ...|mais|quand)\b qui sera pas très efficace étant donné le nombre d'alternatives à tester; et si tu utilises str_replace (même en lui passant un tableau) ta chaîne sera parcourue intégralement pour chaque mot (soit plus de 250 fois dans mon exemple).

    Une autre voie possible est de confronter chaque mot du texte avec la liste. Deux manières de faire:
    • soit tu découpes ta chaîne en tableau avec preg_split puis tu utilises array_diff ou array_udiff pour exclure les mots de la liste.
    • soit tu utilises preg_replace_callback en important la liste dans la fonction de rappel avec use ($list).


    Je ne peux pas être plus précis pour le moment dans la mesure où je ne sais pas si tu souhaites conserver ou non la ponctuation et la casse. Quel est le but final de tout ça?

  7. #7
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    Merci à vous tous !

    Effectivement, c'est pour un moteur de recherche...

    Si dans ma recherche en full text il ne trouve rien, je switch ma recherche en like et les pronoms faussent pas mal de choses...

    je vais opter certainement pour une exclusion des termes de moins de 3 lettres avant de switcher en like...

    Bonne soirée

    Yule

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Si ta recherche fulltext ne donne rien , il y'a peut de chance qu'un like donne des résultats pertinants. Sans compter que niveau performance ça peut être pas terrible.

    En principe dans mysql tu peux lui spécifier stopwords à utiliser :
    https://dev.mysql.com/doc/refman/5.5...ne-tuning.html

    En 5.7 tu peux passer par une table spécifique : https://dev.mysql.com/doc/refman/5.7...stopwords.html

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/05/2008, 12h31
  2. Comment simplifier les beans Hibernate
    Par Dr@ke dans le forum JSF
    Réponses: 16
    Dernier message: 12/12/2007, 12h15
  3. Comment simplifier mon script ?
    Par MMO95 dans le forum Langage
    Réponses: 7
    Dernier message: 09/01/2007, 00h21
  4. [Makefile] Comment simplifier un Makefile compliqué
    Par bouba82 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 27/11/2006, 10h37

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