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:
    194
    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:
    722
    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 940
    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:
    194
    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);
    [email protected]_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 579
    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 940
    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:
    194
    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 940
    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:
    194
    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
    [email protected]_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:
    194
    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
Ecriture d'une unité de mesure et ses variantes (espace) - Impact SEO et dans la recherche Débuter en référencement 9 Septembre 2022
Recherche Google images : mes photos disparaîssent Référencement Google 25 Août 2022
Référencement par la console google des urls avec attribut de recherche Crawl et indexation Google, sitemaps 22 Août 2022
Goggle remplace nos propres liens par les siens dans les résultats de recherche Référencement Google 6 Août 2022
Suppression de la recherche Google conformément au DMCA Référencement Google 20 Juillet 2022
Commande de recherche Google par langue ? Google : l'entreprise, les sites web, les services 10 Juin 2022
Google Keyword Planner: que signifie volume de recherche '0'? AdWords 31 Mars 2022
Comment apparaître dans le bloc "Rechercher des résultats sur" Techniques avancées de référencement 9 Février 2022
Moteur de recherche interne dans mon site Demandes d'avis et de conseils sur vos sites 4 Février 2022
Search Console Negative SEO - SPAM - Page de Recherche - RSS2 - Wordpress Problèmes de référencement spécifiques à vos sites 13 Janvier 2022
Site indexé mais introuvable avec termes de recherche spécifiques Problèmes de référencement spécifiques à vos sites 22 Décembre 2021
Ajout bouton recherche Google sur mon site : Impact SEO Demandes d'avis et de conseils sur vos sites 22 Décembre 2021
Tout simplement à la recherche de conseils... Débuter en référencement 13 Novembre 2021
Volume recherche mots-clés Débuter en référencement 31 Octobre 2021
Impossible de décocher la case de demander aux moteurs de recherche Problèmes de référencement spécifiques à vos sites 29 Octobre 2021
Le moteur de recherche neeva.com demande de payer pour rechercher Autres moteurs de recherche connus 23 Août 2021
Recherche vocale de Google Développement d'un site Web ou d'une appli mobile 11 Août 2021
Search Console Problème de version de langue dans les résultats de recherche Google Référencement international (langues, pays) 17 Juin 2021
Optimiser les vidéos pour la recherche YouTube YouTube, Google Images et Google Maps 27 Avril 2021
Mots-clés longue traîne algorithme moteur de recherche Rédaction web et référencement 20 Avril 2021