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

PHP & Base de données Discussion :

Affichage insensible à la casse [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut Affichage insensible à la casse
    Bonjour,

    Je programme un moteur de recherche en php et SQL.

    Lorsque l'utilisateur effectue une recherche sur un mot dans la liste des résultats je mets en gras la chaine de caractères renvoyée.

    Le problème survient lorsqu'une partie de la chaine de caractère est en majuscule.

    Si l'utilisateur recherche "maison" :
    - en utilisant str_replace, seul les "maison" seront mis en gras et pas les "Maison",

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dat['nom'] = str_replace($nom,"<strong>" . $nom . "</strong>", $dat['nom']);
    - en utilisant str_ireplace, toutes les "maison", "Maison", "maiSon", ... seront mis en gras mais remplacé par la chaine de caractère recherchée par l'utilisateur.

    Exemple: s'il recherche "maison", "Maison" devient "maison"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dat['nom'] = str_ireplace($nom,"<strong>" . $nom . "</strong>", $dat['nom']);
    Pour résumer : Comment mettre les chaines de caractères recherchées en gras quelque soit la casse et sans modifier les chaines de caractères ?

    D'avance merci de vos réponse.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Dans ce cas il vous faut quelque chose d'un peu plus évolué afin de capturer la chaîne correspondante. Je pense notamment à l'extension PCRE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dat['nom'] = preg_replace('/(' . preg_quote($nom) . ')/i', '<strong>$1</strong>', $dat['nom']);
    Et pour une correspondance exacte, par mot (c'est à dire maison dans maisonnette ne sera pas mis en gras), vous pouvez utiliser le délimiteur de mot \b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dat['nom'] = preg_replace('/\b(' . preg_quote($nom) . ')\b/i', '<strong>$1</strong>', $dat['nom']);
    Note : code non testé.


    Julp.

  3. #3
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Merci julp pour votre réponse.

    Votre code fonctionne parfaitement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data['nom'] = preg_replace('/(' . preg_quote($nom) . ')/i', '<strong>$1</strong>', $data['nom']);
    Cependant, j'aimerais y rajouter un petit quelque chose. Que le code fasse en sorte que les é è e soient considérés comme identique, ainsi que :
    - ç, c,
    - à, a,
    - u, ù,
    - ...

    De ce fait lorsque l'on chercherait "çà", le système mettrait en gras tous les noms qui contiennent "ca", "ça", "", "çà", ... au lieu de ceux qui contiennent uniquement "çà".

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Code X : 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
    <?php
    $string = <<< STRING
    De ce fait lorsque l'on chercherait "çà", le système mettrait en gras tous les noms qui contiennent
    "ca", "ça", "cà", "çà", ... au lieu de ceux qui contiennent uniquement "çà".
    STRING;
    
    function highlight($string, $mot) {
    	$speciaux = array(
    		'/a/' => '[aäâàá]',
    		'/c/' => '[cç]',
    		'/e/' => '[eéèëê]',
    		'/i/' => '[iïîìí]',
    		'/o/' => '[oöôòó]',
    		'/u/' => '[uüûùúµ]',
    	);
    	$mot = strtr($mot, 'çñÄÂÀÁäâàáËÊÈÉéèëêÏÎÌÍïîìíÖÔÒÓöôòóÜÛÙÚüûùúµ', 'cnaaaaaaaeeeeeeeeeiiiiiiiioooooooouuuuuuuuu');
    	$mot = preg_replace(array_keys($speciaux), array_values($speciaux), preg_quote($mot)); 
    	return preg_replace('/(' . $mot . ')/i', '<strong>$1</strong>', $string);
    }
    
    echo highlight($string, 'ça');
    ?>
    ²


    Julp.

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

Discussions similaires

  1. Rendre requête insensible à la casse
    Par pierrot67 dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/02/2007, 18h53
  2. Comment effectuer une comparaison LIKE insensible à la casse ?
    Par Hervé Saladin dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 20/10/2006, 12h36
  3. SQL champ texte UNIQUE insensible à la casse
    Par Mike@Nestor dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/10/2005, 08h31
  4. Recherche insensible à la casse ET insensible aux accents.
    Par Bernard Grosdoy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 10/07/2005, 03h32
  5. Tri insensible à la casse [IB7]
    Par patquoi dans le forum Débuter
    Réponses: 4
    Dernier message: 02/06/2003, 08h56

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