Recherche SEULS éléments accentués

WRInaute discret
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 !
 
WRInaute impliqué
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: )
 
WRInaute passionné
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.
 
WRInaute discret
Bonjour, il est 5h, Pau s'éveille ! ( J.Dutronc délocalisé !!! ).
Merci à tous 2 de vous intéresser à mon problème d'accents.

medium69 a dit:
Tu as deux solutions
Tiens, la 2ème est passée à la trappe !

medium69 a dit:
Tu passe le champ concerné en utf8_bin
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 !


chamagne a dit:
Du coup, pour ceux que ça pourrait intéresser, voilà la SOLUTION adoptée (seuls points importants décrits)
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
 
WRInaute passionné
medium69 a dit:
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.

La seconde :mrgreen: 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.

La seconde solution n'était pas passé par la trappe ;)
 
WRInaute discret
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.

@+
 
WRInaute passionné
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.
 
WRInaute discret
jcaron a dit:
where binary(lower(champ)) like lower('%requete%')
Je ne connais pas cette fonction mais si j'ai trouvé 1 solution, merci quand même.

media69 a dit:
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.
Suis preneur pour comparer même si j'ai trouvé 1 solution (voir ci-dessous)

chamagne a dit:
Je ne peux déjà plus modifier mon message avec la solution, alors je vous propose à nouveau MA SOLUTION corrigée

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/
 
WRInaute discret
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
 
Discussions similaires
Haut