1. ✅ Apprenez une METHODE qui marche pour votre SEO ! Formation à distance avec Olivier Duffez et Fabien Facériès + aide pour prise en charge du financement
    Rejeter la notice

Recherche SEULS éléments accentués

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par chamagne, 9 Décembre 2010.

  1. chamagne
    chamagne WRInaute discret
    Inscrit:
    23 Février 2004
    Messages:
    193
    J'aime reçus:
    0
    Bonjour à tous.

    Tout le monde cherche à supprimer les accents, moi je veux les garder et ne trouve pas la solution.
    Sur le net une foule de trucs pour les supprimer mais l'inverse, pas trouvé.

    Données de base :
    - base de données en utf8_general_ci
    - champs intéressés de type text ou varchar

    Problème :
    - module de recherche de mot
    - si mot accentué, recherche de ces SEULS mots accentués (et tant pis pour ceux qui oublient les accents)

    Etat des lieux :
    - utilisation de : WHERE mot LIKE '%$recherche%'
    - j'ajoute aussi, mais c'est un détail (d'ailleurs inutile avec LIKE) : OR name LIKE '%ucfirst($recherche)%' or name LIKE '%strtoupper($recherche)%'

    Résultat :
    - pour une recherche sur le mot ou partie de mot "été" me renvoie aussi les mots contenant "ete", "ête", "éte", "ète" ... j'en passe et des meilleurs.
    - soit une foule de résultats inutiles (une recherche sur "é" me donne tous les enregistrements de la base, oups !)

    Solution très provisoire, j'espère :
    - surlignage du seul mot réellement cherché (éventuellement accentué et casses variables) dans l'affichage des résultats

    Peut-être qu'en FULLTEXT et avec MATCH mais là j'atteins mes limites.

    Merci, oh nobles spécialistes, de vous pencher sur le pb de ma misérable personne !
     
  2. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    728
    J'aime reçus:
    0
    Une méthode "crade" est de changer l'encodage des ces champs par un format single-byte (latin par exemple) mais j'imagine qu'il doit y avoir une meilleure solution que je suis curieux de lire (c'est une façon détournée de m'abonner au topic :lol: )
     
  3. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    Tu as deux solutions :

    La première est loin d'être un modèle d'optimisation : passer par une REGEXP via Mysql ou la suivante.

    Tu passe le champ concerné en utf8_bin ; tu garde ainsi l'avantage des caractères étendu, d'où la possibilité de faire ce que tu veux.

    Attention, dans ce cas de figure les accents, mais aussi les majuscules sont différenciées.
     
  4. chamagne
    chamagne WRInaute discret
    Inscrit:
    23 Février 2004
    Messages:
    193
    J'aime reçus:
    0
    Bonjour, il est 5h, Pau s'éveille ! ( J.Dutronc délocalisé !!! ).
    Merci à tous 2 de vous intéresser à mon problème d'accents.

    Tiens, la 2ème est passée à la trappe !

    Bien sûr, je vais me chercher des infos là-dessus.
    ...
    Ca me parait bien répondre à la question, je vais tester ça de suite
    Voyons, comment faire sans faire de bêtises
    ...
    ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
    ...
    Bon, d'abord une sauvegarde de ma BD, essentiel, non ?
    ... OK
    Je lance la requête sur mes tables concernées, OK ça marche !
    ...
    Je teste sur ma recherche, OK ça marche, GENIAL, hormis le fait que la casse ne soit pas prise en compte malgré mes ucfirst et strtoupper.
    Je revois la chose.
    ...
    OK, PARFAIT, GENIAL
    Un grand MERCI
    L'entraide entre webmestres, c'est super !


    Problème :
    recherche de mots accentués et seulement ceux-ci mais avec casses différentes (mot en minuscules, en majuscules ou seule 1ère lettre majuscule)

    Base de données :
    la table doit être en utf8_bin

    La requête de la recherche :
    soit $recherche le mot recherché et $champ le champ concerné
    $recherche_ucfirst=ucfirst($recherche);
    $recherche_strtoupper=strtoupper($recherche);
    $search=@mysql_query("SELECT champ FROM table WHERE champ LIKE '%$recherche%' OR name LIKE '%$recherche_ucfirst%' OR name LIKE '%$recherche_strtoupper%'",$db);


    L'afichage des résultats avec surlignage en jaune du mot recherché dans le champ (plusieurs occurrences possibles par enregistrement) :
    $resultat=str_replace($recherche,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche."</span>",$champ);
    $resultat=str_replace($recherche_ucfirst,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche_ucfirst."</span>",$champ);
    $resultat=str_replace($recherche_strtoupper,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche_strtoupper."</span>",$champ);
    echo $resultat;


    Seul problème :
    Si on recherche une expression, seul le 1er mot de l'expression avec majuscule en 1ère lettre est pris en compte (OK pour tout en minuscules ou majuscules), m'enfin, c'est déjà pas mal et suis content de moi, euh, pardon, de nous !

    A bientôt pour d'autres interrogations !

    PS : vous pouvez voir ou tester ce module de recherche sur http://www.afleurdepau.com/1two-nature/, mon nouvel Annuaire Nature.
    ( la version française sera modifiée ainsi dans la journée)
    Et il est déjà 8h, mais 3h pour régler et corriger ce pb n'est rien au vu des jours passés à développer cet annuaire
     
  5. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 593
    J'aime reçus:
    0
    where binary(lower(champ)) like lower('%requete%')

    Non?

    Jacques.
     
  6. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    La seconde solution n'était pas passé par la trappe ;)
     
  7. chamagne
    chamagne WRInaute discret
    Inscrit:
    23 Février 2004
    Messages:
    193
    J'aime reçus:
    0
    Je m'aperçois qu'il y a encore quelques petits pb que je vais régler, celui des lettres accentuées en 1ère lettre.
    Par exemple :
    La recherche de "écologie" doit trouver et surligner écologie mais aussi Ecologie et encore ECOLOGIE, mais pas avec le é majuscule (n'arrive pas à l'indiquer ici) que je n'admet pas, personnellement, en langue française, c'est bon pour la typo des pubs, journaux et magazines !
    Ca va se régler et mettrai le code final dans la solution ci-dessus, mon ucfirst à modifier

    Un pb identique avec strtoupper a été réglé, le mettrai aussi dans la solution, demain, car ai d'autres occupations aujourd'hui.

    @+
     
  8. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    Je ne suis pas chez moi en ce moment, mais j'ai un bout de code qui permet de mettre des majuscules sur les lettres accentué non pris en compte par Ucfirst.

    Tu devrais pouvoir l'adapter à ton usage.
     
  9. chamagne
    chamagne WRInaute discret
    Inscrit:
    23 Février 2004
    Messages:
    193
    J'aime reçus:
    0
    Je ne connais pas cette fonction mais si j'ai trouvé 1 solution, merci quand même.

    Suis preneur pour comparer même si j'ai trouvé 1 solution (voir ci-dessous)

    Problème :
    recherche de mots accentués et seulement ceux-ci mais avec casses différentes (mot en minuscules, en majuscules ou seule 1ère lettre majuscule)

    Base de données :
    la table doit être en utf8_bin

    La requête de la recherche :
    soit $recherche le mot recherché et $champ le champ concerné
    // mot recherché avec 1ère lettre en majuscule non accentuée
    $recherche_ucfirst=ucfirst(strtr(substr($recherche,0,1),"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn")).substr($recherche,1);
    // mot recherché entièrement en majuscules non accentuées
    strtoupper(strtr($recherche,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn"));
    // recherche dans la base
    $search=@mysql_query("SELECT champ FROM table WHERE champ LIKE '%$recherche%' OR name LIKE '%$recherche_ucfirst%' OR name LIKE '%$recherche_strtoupper%'",$db);

    L'afichage des résultats avec surlignage en jaune du mot recherché dans le champ (plusieurs occurrences possibles par enregistrement) :
    // mot recherché tel qu'il est entré
    $resultat=str_replace($recherche,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche."</span>",$champ);
    // mot recherché avec 1ère lettre en majuscule non accentuée
    $resultat=str_replace($recherche_ucfirst,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche_ucfirst."</span>",$champ);
    // mot recherché tout en majuscules
    $resultat=str_replace($recherche_strtoupper,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche_strtoupper."</span>",$champ);
    // affichage
    echo $resultat;
    Le tout, bien sûr en boucle sur tous les enregistrements récupérés de la bd.

    Encore MERCI à tous.
    Peut-être cette solution pourra aider ou donner des idées à quelqu'un.
    Bon weekend !

    PS : la version française est OK pour les non anglophones : http://www.afleurdepau.com/1two-nature/fr/
     
  10. chamagne
    chamagne WRInaute discret
    Inscrit:
    23 Février 2004
    Messages:
    193
    J'aime reçus:
    0
    Bonjour
    Encore moi car l'affichage n'était pas aussi simple qu'il y paraissait.
    Remplacez donc ce paragraphe dans le message précédent :

    L'affichage des résultats avec surlignage en jaune du mot recherché dans le champ (plusieurs occurrences possibles par enregistrement) :
    // 1ere lettre du mot recherché
    $recherche2=substr($recherche,0,1);
    // conversion en entité html
    $recherche2=htmlentities($recherche2, ENT_NOQUOTES, $charset);
    // remplacement de ce caractère éventuellement accentué, majuscule ou minuscule, en minuscule non accentuée
    $recherche2=preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $recherche2);
    // mise en majuscule non accentuée du 1er caractère
    $recherche2=strtoupper($recherche2);
    // mot recherché avec majuscule non accentuée en début de mot
    $recherche2=$recherche2.substr($recherche,1);
    // idem pour le mot recherché en majuscules non accentuées
    $recherche3=htmlentities($recherche, ENT_NOQUOTES, $charset);
    $recherche3=preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $recherche3);
    $recherche3=strtoupper($recherche3);


    Ce n''est pas de moi, mais trouvé sur http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html

    Ainsi on recherche pour surlignage :
    - le mot tel quel (écologie par exemple)
    - le mot avec 1ère lettre en majuscule (Ecologie)
    - le mot en majuscules (ECOLOGIE)

    Puis le surlignage :
    // mot recherché tel qu'il est entré
    $resultat=str_replace($recherche,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche."</span>",$champ);
    // mot recherché avec 1ère lettre en majuscule non accentuée
    $resultat=str_replace($recherche2,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche2."</span>",$champ);
    // mot recherché tout en majuscules non accentuées
    $resultat=str_replace($recherche3,"<span style='background:#FFFF00; font-weight:bold; '>".$recherche3."</span>",$champ);
    // affichage
    echo $resultat;

    @+ et bon dimanche
     
Chargement...
Similar Threads - Recherche SEULS éléments Forum Date
J'ai indexé mes pages sur searchConsole, mais les pages ne figurent pas dans les résultats recherche Crawl et indexation Google, sitemaps 7 Septembre 2020
Le moteur de recherche d'Apple va-t-il voir le jour ? Autres moteurs de recherche connus 27 Août 2020
Moteur de recherche interne Google Développement d'un site Web ou d'une appli mobile 10 Juillet 2020
Mon site wordpress ne s'affiche pas dans recherches Google Problèmes de référencement spécifiques à vos sites 30 Juin 2020
Search Console Google Search console: page envoyée et indexée mais introuvables par une recherche google Référencement Google 30 Juin 2020
Google en fait trop avec les intentions de recherche Référencement Google 29 Février 2020
Recherche Google - an error occured Problèmes de référencement spécifiques à vos sites 31 Janvier 2020
recherche aléatoire des bots ?! Référencement Google 14 Janvier 2020
Encart "Rechercher des résultats sur" Référencement Google 10 Janvier 2020
SEO: Taper le nom de domaine dans la recherche google Référencement Google 6 Janvier 2020