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 :

Problème avec preg_replace


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Problème avec preg_replace
    Dans mon application je recherche tous les textes qui contiennent un certain mot, par exemple Eglise, et je souhaite mettre les mots trouvés en surbrillance.
    Tous les mots avec ou sans accents doivent être trouvés.

    Pour ce faire je transforme le critère reçu (ici $critere="Eglise") avec des instructions preg_replace, c'est à dire dans le cas présent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $critere = preg_replace('/[eèéêë]/i', '(e|è|é|ê|ë)', $critere);
    $critere = preg_replace('/[iìíîï]/i', '(i|ì|í|î|ï)', $critere);
    Ensuite je lance la recherche du critère dans mon texte avec une instruction preg_match :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb=preg_match_all($critere, $texte, $matches, PREG_OFFSET_CAPTURE);
    Il se trouve que seuls Eglise et eglise sont trouvés, mais pas église

    Merci à qui pourra me dire où est mon problème.
    Caperquy

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    cherche du coté de l'encoding accepté par la fonction preg_replace. si tu n'as pas le bon encodage, ça marchera pas.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    ton preg_replace n'est pas bon :
    église va devenir : (e|è|é|ê|ë)(e|è|é|ê|ë)glis(e|è|é|ê|ë)

    si tu veux supprimer les accents fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $critere = 'église';
    echo preg_replace('/[èéêë]/ui', 'e', $critere);
    mais bon c'est de la bidouille tout ca...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Problème avec preg_replace
    Merci pour la réponse.
    En fait je ne cherche pas à supprimer les accents, mais seulement à localiser le mot, qu'il ait ou non un accent.

    CapErquy

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par CapErquy Voir le message
    Merci pour la réponse.
    En fait je ne cherche pas à supprimer les accents, mais seulement à localiser le mot, qu'il ait ou non un accent.

    CapErquy
    sauf qu'il fait la différence entre un mot avec accents et un mot sans accents, donc t'es bien obligé de tout mettre au même niveau, a la base c'est pour faire quoi ? ton texte il vient d'où ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Mon texte vient d'une base de données MySQL dans laquelle se trouvent des résumés d'articles. L'utilisateur cherche à retrouver quels articles traitent d'un sujet identifié par le mot clé qu'il a choisi. En retour je veux lui renvoyer le ou les articles trouvés avec le ou les mots correspondants mis en surbrillance.
    Au départ on ignore donc si dans les différents articles on trouvera le mot cherché avec ou sans accents.
    CapErquy

  7. #7
    Membre habitué Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 267
    Points : 164
    Points
    164
    Par défaut
    euhh.... ça à l'air un peu costaud, non ?
    car lui, il peut rechercher :
    Eglise / église / eglise /eglises / églises / etc.... et sans compter les fautes (bon, là, c'est vrai , ça sera normal qu'il trouve pas, et pourquoi pas preciser "attention aux fautes" )
    il faut donc peut etre recuperer le mot et chercher toutes les solutions
    Eglise / église / eglise /eglises / églises
    ... a noter que si tu cherches eglises avec un "s" tu trouveras pas eglise sans "s"
    et si tu cherches Eglise, comment tu peux savoir qu'on peux remplacer le "E" par un "é", et non pas par un "e" ....

    ... y'a du taffe , je pense , pour faire un bon moteur......!!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Merci à Zugolin pour la réponse.
    Je ne suis pas concerné par les pluriels ou autres fautes qui sont inévitables, mais je veux juste retrouver les mots sans me soucier des majuscules ou minuscules, ni des caractères accentués que j'ai définis en utilisant les expressions régulières (voir mon premier message sur ce sujet).
    Il se trouve que quand je soumets directement à mes instructions preg_replace et preg_match un texte dans lequel j'utilise les mots Eglise, église, eglise les trois écritures sont bien reconnues. Par contre je reçois mes données à partir d'une base de données MySQL et là çà ne marche plus. Je soupçonne un problème d'encoding mais je n'arrive pas à déterminer lequel.
    D'où mon appel à l'aide

  9. #9
    Membre habitué Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 267
    Points : 164
    Points
    164
    Par défaut
    église, par exemple , il serait pas en html, dans ta bdd :
    é => é
    ou numérique => & # 233 ; (je mets des espaces, sinon, l'editeur re-interprete le code)

    ou bien une histoire de utf8 ou iso-8859-1 ....?
    faudrait plutot aller voir du coté mysql, alors...non?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Non je n'utilise pas les symboles tels que é dans ma base de données. J'ai essayé de basculer ma table en utf8_general_ci ; les mots tels que église sont alors bien retrouvés mais c'est également tout l'ensemble des caractères accentués qui apparaissent alors sous la forme � lors de l'affichage.
    MySQL ne me propose pas l'option iso-8859-1
    Je désespère de trouver une solution. En tous cas merci d'avoir essayé de m'aider
    CapErquy

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    tu fais pas la recherche direct dans la requete SQL ?

  12. #12
    Membre habitué Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 267
    Points : 164
    Points
    164
    Par défaut
    c'est peut etre ta page php elle meme qui pourrait avoir des problemes d'encodage, alors ;
    du coté du doctype :
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    ... ou bien une erreur d'encodage de la page ; si tu travails avec notepad++, comme moi, j'envoi la page en => format: convertir en format unix // encoder en ainsi ... y'aurait pas un soucis vers là ?

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par CapErquy Voir le message
    Non je n'utilise pas les symboles tels que &eacute; dans ma base de données. J'ai essayé de basculer ma table en utf8_general_ci ; les mots tels que église sont alors bien retrouvés mais c'est également tout l'ensemble des caractères accentués qui apparaissent alors sous la forme � lors de l'affichage.
    MySQL ne me propose pas l'option iso-8859-1
    Je désespère de trouver une solution. En tous cas merci d'avoir essayé de m'aider
    CapErquy
    Il faut que toutes les entêtes concordent pour ne pas avoir des erreurs d'affichage en utf-8.

    Si tu ne veux pas utiliser l'utf-8 essayes l'Interclassement latin1_swedish_ci

  14. #14
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere = preg_replace('/[eèéêë]/iu', '[eèéêë]', $critere);
    et pour le code en entier avec fonction de surbrillance voici un lien :
    http://php.net/manual/fr/function.preg-replace.php
    regarde highlighter dans les codes en dessous de la description de la fonction preg_replace.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Réponse à vorace :
    je viens d'essayer ta formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere = preg_replace('/[eèéêë]/iu', '(eèéêë)', $critere);
    mais j'obtiens le message d'erreur suivant :

    preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 3

  16. #16
    Membre habitué Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 267
    Points : 164
    Points
    164
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere = preg_replace('/[eèéêë]/iu', '(eèéêë)', $critere);
    ..une histoire de delimiteur, non ?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere = preg_replace('#[eèéêë]#iu', '(eèéêë)', $critere);
    ... ou quelque chose comme ça ......

  17. #17
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    si tu utilise notepad++, converti ton fichier en utf-8 (sans-BOM) et enregistre, voila pourquoi tu as cette erreur, tu n'as pas enregistré ton fichier en utf-8, si tu utilise un autre editeur (je ne connais pas les autres) ca doit etre faisable aussi et tu pourras utiliser le code que je t'ai donné, de plus dans la fonction preg_replace pour le second parametre tu dois mettre des [] a la place des parentheses.

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par CapErquy Voir le message
    Réponse à vorace :
    je viens d'essayer ta formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere = preg_replace('/[eèéêë]/iu', '(eèéêë)', $critere);
    mais j'obtiens le message d'erreur suivant :

    preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 3
    est ce que tu comprends ce que va faire le regexp la ???
    parce que je t'ai deja dis ce que sa donne et visiblement personne percute :
    http://www.developpez.net/forums/d10...e/#post5750378

  19. #19
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    le but étant de mettre en surbrillance les mots telsque Eglise, église ou eglise si le mot rechercher est eglise donc une recherche indépendamment des accents le bout de code que j'ai mis provient de celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
    function prepare_search_term($str,$delim='#') {
        $search = preg_quote($str,$delim);
     
        $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search);
        $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search);
        $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search);
        $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search);
        $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search);
        // add more characters...
     
        return $search;
    }
     
    function highlight($searchtext, $text) {
        $search = prepare_search_term($searchtext);
        return preg_replace('#' . $search . '#iu', '<span style="background-color:red">$0</span>', $text);
    }
     
    $testtext = 'cafe cáfé càfè CAFE CÁFÉ CÀFÈ càfé cáfè CÀFÉ CÁFÈ';
    echo highlight('cafe',$testtext) . '<br />';
    echo highlight('cáfé',$testtext) . '<br />';
    echo highlight('CAFE',$testtext) . '<br />';
    echo highlight('CÀFÉ',$testtext) . '<br />';
    ?>
    en utf-8 ca marche très bien, à savoir fichier codé en utf-8 et page html en utf-8 aussi.

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    arf la bidouille...
    et si tu mets cafette, il va ca mettre le mettre en surbrillance aussi et que le bout cafe

Discussions similaires

  1. [RegEx] problème avec preg_replace
    Par mike_chti dans le forum Langage
    Réponses: 2
    Dernier message: 29/09/2008, 17h12
  2. [RegEx] UTF8, problème avec preg_replace
    Par Space Cowboy dans le forum Langage
    Réponses: 4
    Dernier message: 30/04/2008, 16h42
  3. [RegEx] Problème avec preg_replace
    Par Vinzius dans le forum Langage
    Réponses: 6
    Dernier message: 27/05/2006, 23h10
  4. [RegEx] Problème avec preg_replace
    Par Vinzius dans le forum Langage
    Réponses: 4
    Dernier message: 08/05/2006, 01h06
  5. [RegEx] problème avec preg_replace
    Par carlos20 dans le forum Langage
    Réponses: 6
    Dernier message: 27/10/2005, 10h29

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